{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Inżynieria cech" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Definicja \n", "\n", "Feature Engineering polega na przekształcaniu surowych danych w cechy użyteczne w procesie modelowania. \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Info \n", "\n", "Tworzenie zmiennych predykcyjnych zawsze powinno opierać się przede wszystkim na zrozumieniu danych i wiedzy biznesowej związanej z danym problemem. Istnieje jednak kilka standardowych technik, które można stosować do tworzenia cech w większości problemów, można tu wyróżnić:\n", "- przekształcanie zmiennych kategorycznych\n", "- zmienne na podstawie cech z daty\n", "- zmienne powstałe przez przesunięcie w czasie\n", "- transformacje zmiennych numerycznych\n", "- zmienne interakcji\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Uwaga! \n", " \n", "Feature Engineering stanowi jeden z ważniejszych etapów w procesie budowy uczenia maszynowego, dlatego należy mu poświęcić dużo uwagi. Często można uzyskać znacznie lepsze wyniki mając prosty model oparty na cechach predykcyjnych dobrze oddających naturę badanego zjawiska niż budując wyrafinowany model w oparciu o zbyt wąski zbiór zmiennych.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Tworzenie przykładowych zbiorów danych" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zaprezentujemy tutaj 2 przykładowe zbiory danych o różnym charakterze oraz przykłady zmiennych predykcyjnych, które można wygenerować na ich podstawie" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:51.187621Z", "start_time": "2021-10-13T07:15:40.687595Z" } }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:51.344602Z", "start_time": "2021-10-13T07:15:51.332608Z" } }, "outputs": [], "source": [ "def generateIceCreamSalesData(month_coef=10000, week_coef=1000, day_coef=100, random_coef =10000):\n", " dates = pd.date_range(start=\"2018-01-01\", end=\"2020-12-31\", freq =\"D\")\n", " df = pd.DataFrame(dates, columns=[\"SalesDate\"])\n", " df[\"Month\"] = df.SalesDate.dt.month\n", " df[\"Week\"] = df.SalesDate.dt.isocalendar().week\n", " df[\"WeekDay\"] = df.SalesDate.dt.dayofweek+1\n", " df[\"IceCreamSales\"] = (-1*np.power(df.Month-6,2)+np.power(6,2))*month_coef + (-1*np.power(df.Week-27,2)+np.power(27,2))*week_coef +df.WeekDay*day_coef +random_coef * np.random.randint(low =1,high =10, size=len(df))\n", " return df.loc[:,[\"SalesDate\",\"IceCreamSales\"]]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:51.668480Z", "start_time": "2021-10-13T07:15:51.471482Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SalesDateIceCreamSales
02018-01-01253100
12018-01-02223200
22018-01-03173300
32018-01-04223400
42018-01-05223500
.........
10912020-12-27134700
10922020-12-28143100
10932020-12-2993200
10942020-12-3073300
10952020-12-31133400
\n", "

1096 rows × 2 columns

\n", "
" ], "text/plain": [ " SalesDate IceCreamSales\n", "0 2018-01-01 253100\n", "1 2018-01-02 223200\n", "2 2018-01-03 173300\n", "3 2018-01-04 223400\n", "4 2018-01-05 223500\n", "... ... ...\n", "1091 2020-12-27 134700\n", "1092 2020-12-28 143100\n", "1093 2020-12-29 93200\n", "1094 2020-12-30 73300\n", "1095 2020-12-31 133400\n", "\n", "[1096 rows x 2 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "IceCream_df = generateIceCreamSalesData()\n", "IceCream_df" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:51.898539Z", "start_time": "2021-10-13T07:15:51.872481Z" } }, "outputs": [], "source": [ "def generate_used_cars_data(len_df =1000):\n", " conditions ={\"very_bad\":1,\"bad\":2,\"medium\":3,\"good\":4,\"very_good\":5}\n", " brands =[\"Fiat\",\"Renault\",\"VW\", \"Seat\", \"Skoda\",\"Toyota\", \"Audi\",\"BMW\",\"Mercedes\", \"Bugatti\"]\n", " standard_brands = [\"Fiat\",\"Renault\",\"VW\", \"Seat\", \"Skoda\",\"Toyota\"]\n", " premium_brands = [\"Audi\",\"BMW\",\"Mercedes\"]\n", " luxury_brands = [\"Bugatti\"]\n", " dict_data ={\"condition\":np.random.choice(list(conditions.keys()),size=len_df, p = [0.05, 0.15, 0.3, 0.3,0.2 ]),\n", " \"brand\":np.random.choice(brands,size=len_df, p=[0.1]*10 ),\n", " \"year_manufactured\":np.random.randint(1950,2020,size =len_df)\n", " }\n", " df = pd.DataFrame(dict_data)\n", " df[\"age\"] =2021- df.year_manufactured\n", " df[\"mileage\"] = df.age *np.random.randint(100,10000, len_df)+np.random.randint(100,10000, len_df)\n", " \n", " df[\"selling_price\"] = 100000*df[\"brand\"].isin(standard_brands)+300000*df[\"brand\"].isin(premium_brands)+600000*df[\"brand\"].isin(luxury_brands)\n", " df[\"selling_price\"] /= np.log1p(df.age)+np.log1p(df.mileage)\n", " df[\"condition_num\"] = df.condition.map(lambda x:conditions[x])\n", " df[\"selling_price\"] *= np.log1p(df[\"condition_num\"])\n", " df.loc[(df[\"brand\"].isin(luxury_brands))&(df.year_manufactured<=1970)&(df[\"condition_num\"]>3),\"selling_price\"] *=\\\n", " np.log1p(df.loc[(df[\"brand\"].isin(luxury_brands))&(df.year_manufactured<=1970)&(df[\"condition_num\"]>3),\"age\"])\n", " df[\"selling_price\"] = np.round(df[\"selling_price\"])\n", " return df.loc[:,[\"selling_price\",\"condition\",\"mileage\",\"brand\",\"year_manufactured\"]]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:52.225195Z", "start_time": "2021-10-13T07:15:52.139106Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
selling_priceconditionmileagebrandyear_manufactured
09847.0good338883Fiat1985
17899.0medium589817Renault1951
211231.0good79656Toyota2001
333941.0good115919Mercedes2009
438360.0very_good64115Mercedes2003
..................
99510204.0medium29430Renault1995
99636737.0very_good119063Audi2003
9978692.0bad14683Seat2001
99816719.0very_good15039Renault2019
99939886.0very_good44529BMW2006
\n", "

1000 rows × 5 columns

\n", "
" ], "text/plain": [ " selling_price condition mileage brand year_manufactured\n", "0 9847.0 good 338883 Fiat 1985\n", "1 7899.0 medium 589817 Renault 1951\n", "2 11231.0 good 79656 Toyota 2001\n", "3 33941.0 good 115919 Mercedes 2009\n", "4 38360.0 very_good 64115 Mercedes 2003\n", ".. ... ... ... ... ...\n", "995 10204.0 medium 29430 Renault 1995\n", "996 36737.0 very_good 119063 Audi 2003\n", "997 8692.0 bad 14683 Seat 2001\n", "998 16719.0 very_good 15039 Renault 2019\n", "999 39886.0 very_good 44529 BMW 2006\n", "\n", "[1000 rows x 5 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "UsedCars_df =generate_used_cars_data()\n", "UsedCars_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cechy tworzone na podstawie danych czasowych" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pierwszy zbiór danych nazwany tutaj IceCream_df de facto ma charakter szeregu czasowego i patrząc na poniższy wykres mógłby być z powodzeniem przewidywany dedykowanymi metodami do predykcji szeregów czasowych, jednak dla celów pokazania tworzenia zmiennych na podstawie danych o charakterze czasowym potraktujemy to zagadnienie jako problem regresyjny, w którym naszą zmienną celu będzie IceCreamSales." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:53.756282Z", "start_time": "2021-10-13T07:15:52.570422Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2oAAAIyCAYAAAC6gTklAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAADZwUlEQVR4nOzdd3gc1dk28PtsX/Viyb3buGPApif0FgjppBdIIZ03jbwkIQlpkC89pBFeQkgIkISEBBJq6ISOweCOjXuVZFlalS2zs/P9MXNmz8zOypItbb1/15Ur0molj4129jznKUcYhgEiIiIiIiIqHb5iXwARERERERE5MVAjIiIiIiIqMQzUiIiIiIiISgwDNSIiIiIiohLDQI2IiIiIiKjEMFAjIiIiIiIqMQzUiIiICkwIsVUIcVaxr4OIiEoXAzUiIjpsoxV4CCGOEELcLoToEkL0CiFeEUJ8QQjhH43rHE1CiNcJIZ6yrrNbCPGkEOLYYl8XERFVBgZqRERUEoQQswE8C2AHgCWGYTQCuAjAcgD1Hs8PFPYKHX92A4B/A/gFgBYAkwF8C0CyWNdERESVhYEaERGNOiHEx4QQ64QQfUKItUKIY6zHJwkh/i6E6BRCbBFCXKZ827cAPGUYxhcMw9gDAIZhbDAM472GYfQIIWYIIQwhxEeEENsBPGz9zA9bf9YBIcT9QojpynX8XAixQwgRE0KsEEK8XvnaVVb27k/Wda6yMnpfEUJ0WN93Tp6/4hHW9d1mGIZuGEbcMIwHDMN4xfrZs4UQDwsh9lvZwVuEEE15/q18QogrhBCvWc//qxCixfpaxLq+/UKIHiHE80KI8Yf4n4WIiMoIAzUiIhpVQoiLAFwF4IMAGgC8CcB+IYQPwL8AvAwzA3UmgM8JIc61vvUsAH8bxh9xKoAFAM4VQrwFwFcBvA1AG4AnANymPPd5AEfBzHrdCuB2IURE+fqFAG4G0AzgJQD3w3xvnAzg2wB+m+caXgWgCyH+IIR4gxCi2f3PAOAaAJOsa51q/Zt4uQzAW6y/1yQABwD8yvrahwA0Wt/fCuATAOJ5fg4REVWQogZqQogbrV3L1cN8/jutndk1Qohbx/r6iIjokHwUwA8Mw3jeMG0yDGMbgGMBtBmG8W3DMFKGYWwG8H8A3m19XyuAPcP4+VcZhjFgGEYcwMcBXGMYxjrDMNIArgZwlMyqGYbxJ8Mw9huGkTYM48cAwgDmKT/rCcMw7re+93aYwd73DcPQAPwZwAyvTJhhGDEArwNgWH+HTiHEXTLbZf2d/2MYRtIwjE4AP4EZiHn5OICvGYax0zCMJMyA7h1Waadm/bvMsTJ3K6w/m4iIKlyxM2o3AThvOE8UQswF8BUAJxuGsQjA58busoiI6DBMBfCax+PTAUyySvh6hBA9MLNhspRvP4CJw/j5O1w/8+fKz+uGmc2aDABCiC9aZZG91tcbAYxTvn+f8nEcQJdhGLryOQDUeV2EFRxebBjGFACLYWbDfmb9ue1CiD8LIXYJIWIA/uT6c1XTAfxD+TusA6DD/He5GWaW789CiN1CiB8IIYJD/NsQEVGFKGqgZhjG4zDfVG1WXf99Vi/BE0KI+daXPgbgV4ZhHLC+t6PAl0tERMOzA8DsPI9vMQyjSflfvWEY51tffxDA24fx8w3Xz/y462dGDcN4yupH+18A7wTQbBhGE4BemIHcqDIMYz3MzcfF1kPXWNd5pGEYDQDeP8SfuwPAG1x/h4hhGLsMw9AMw/iWYRgLAZwE4I0wS0qJiKjCFTuj5uV6AJ81DGMZgC8B+LX1+BEAjrDGHz8jhBhWJo6IiAruBgBfEkIsE6Y5VinicwBiQoj/FUJEhRB+IcRiZaT9NwGcJIT4oRBiAgBY3/unfIM4AFwH4CtCiEXW8xutHjnAnBSZBtAJICCE+AbMnrnDJoSYb2XrplifTwXwHgDPKH92P4AeIcRkAJcP8eOuA/A9Wa4phGgTQrzZ+vh0IcQSYR5PEINZCqnn/1FERFQpSipQE0LUwdwxvF0IsRJmE7csgwkAmAvgNJhvhjcM8cZNRERFYhjG7QC+B3N4Rx+AfwJosUoKL4Q53GMLgC6YQV2j9X2vATgRwAwAa4QQvQD+DuAF6+d4/Vn/APD/YJYGxgCsBvAG68v3A7gX5uCPbQAScJZNHo4+AMcDeFYIMQAzQFsN4IvW178F4BiYGby7AdwxxM/6OYC7ADwghOizftbx1tcmwBywEoNZEvkYzDJKIiKqcMIwjIM/aywvQIgZAP5tGMZiYZ5Ls8EwjJweBSHEdQCeMQzjJuvzhwBcYRjG84W8XiIiIiIiorFWUhk1a5LVFlm2YpXMLLW+/E8Ap1uPj4NZCrm5GNdJREREREQ0loo9nv82AE8DmCeE2CmE+AiA9wH4iBDiZQBrALzZevr9MM/hWQvgEQCXG4axvxjXTURERERENJaKXvpIRERERERETiVV+khEREREREQM1IiIiIiIiEpOoFh/8Lhx44wZM2YU648nIiIiIiIqqhUrVnQZhtHm9bWiBWozZszACy+8UKw/noiIiIiIqKiEENvyfY2lj0RERERERCWGgRoREREREVGJYaBGRERERERUYorWo0ZERERERCOnaRp27tyJRCJR7EuhYYpEIpgyZQqCweCwv4eBGhERERFRGdm5cyfq6+sxY8YMCCGKfTl0EIZhYP/+/di5cydmzpw57O9j6SMRERERURlJJBJobW1lkFYmhBBobW0dcQaUgRoRERERUZlhkFZeDuW/FwM1IiIiIiIakbq6ukP+3j/+8Y9YvHgxFi1ahIULF+JHP/rRKF7Zwd14441YsmQJjjzySCxevBh33nnnkM+/6qqrCn6NwDB61IQQNwJ4I4AOwzAWe3z9fQD+1/q0H8AnDcN4eVSvkoiIiIiIyt69996Ln/3sZ3jggQcwadIkJBIJ3HzzzTnPS6fTCARGf5zGzp078b3vfQ8vvvgiGhsb0d/fj87OzlH/c0bDcDJqNwE4b4ivbwFwqmEYRwL4DoDrR+G6iIiIiIioDPzgBz/AkiVLsHTpUlxxxRUAgNdeew3nnXceli1bhte//vVYv349AOCaa67Bj370I0yaNAmAOQ3xYx/7GADgtNNOw1e/+lWceuqp+PnPf44VK1bg1FNPxbJly3Duuediz549AID/+7//w7HHHoulS5fi7W9/OwYHBwEAF198MT75yU/i9NNPx6xZs/DYY4/hwx/+MBYsWICLL74YANDR0YH6+no7I1hXV2cP+Mj3c1X5/l633347Fi9ejKVLl+KUU04ZlX/Xg4aphmE8LoSYMcTXn1I+fQbAlFG4LiIiIiIiOohv/WsN1u6OjerPXDipAd+8cNGwnnvvvffin//8J5599lnU1NSgu7sbAHDppZfiuuuuw9y5c/Hss8/iU5/6FB5++GGsXr0ay5Yty/vzenp68Nhjj0HTNJx66qm488470dbWhr/85S/42te+hhtvvBFve9vb7ODuyiuvxO9+9zt89rOfBQAcOHAADz/8MO666y5ceOGFePLJJ3HDDTfg2GOPxcqVK7F06VKMHz8eM2fOxJlnnom3ve1tuPDCCwFgyJ8r5ft7ffvb38b999+PyZMno6enZ0T/3vmMdj7xIwDuHeWfSUREREREJejBBx/EJZdcgpqaGgBAS0sL+vv78dRTT+Giiy6yn5dMJof18971rncBADZs2IDVq1fj7LPPBgDouo6JEycCAFavXo0rr7wSPT096O/vx7nnnmt//4UXXgghBJYsWYLx48djyZIlAIBFixZh69atOOqoo3Dffffh+eefx0MPPYTPf/7zWLFiBa666qohfy6AIf9eJ598Mi6++GK8853vxNve9rYR/RvmM2qBmhDidJiB2uuGeM6lAC4FgGnTpo3WH01EREREVJWGm/kaK4Zh5Ew0zGQyaGpqwsqVK3Oev2jRIqxYsQJnnHGG58+rra21f+6iRYvw9NNP5zzn4osvxj//+U8sXboUN910Ex599FH7a+FwGADg8/nsj+Xn6XQagDmB8bjjjsNxxx2Hs88+G5dccgmuuuqqIX/uwf5e1113HZ599lncfffdOOqoo7By5Uq0trZ6/h2Ha1SmPgohjgRwA4A3G4axP9/zDMO43jCM5YZhLG9raxuNP5qIiIiIiIrknHPOwY033mj3c3V3d6OhoQEzZ87E7bffDsAMul5+2Zw1+JWvfAVf/vKXsXfvXgBmRuraa6/N+bnz5s1DZ2enHahpmoY1a9YAAPr6+jBx4kRomoZbbrllRNe7e/duvPjii/bnK1euxPTp04f1c4f6e7322ms4/vjj8e1vfxvjxo3Djh07RnRdXg47oyaEmAbgDgAfMAzj1cO+IiIiIiIiKgvnnXceVq5cieXLlyMUCuH888/H1VdfjVtuuQWf/OQn8d3vfheapuHd7343li5divPPPx/79u3DWWedZWfjPvzhD+f83FAohL/97W+47LLL0Nvbi3Q6jc997nNYtGgRvvOd7+D444/H9OnTsWTJEvT19Q37ejVNw5e+9CXs3r0bkUgEbW1tuO666wBgWD8339/r8ssvx8aNG2EYBs4880wsXbr00P9RLcIwjKGfIMRtAE4DMA7APgDfBBAEAMMwrhNC3ADg7QC2Wd+SNgxj+cH+4OXLlxsvvPDCoV85EREREVEVWrduHRYsWFDsy6AR8vrvJoRYkS92Gs7Ux/cc5OsfBfDRkVwkERERERER5TcqPWpEREREREQ0ehioERERERERlRgGakREREREI6BnDMRTOgBgc2e/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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "IceCream_df.set_index(\"SalesDate\").plot(figsize=(15,9), title=\"IceCream Sales\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wyraźnie widać tutaj, że sprzedaż lodów ma silnie sezonowy charakter, stąd cechy wyciągnięte z daty powinny znacznie ułatwić dobrą predykcję. Funkcję generującą takie cechy zaprezentowano poniżej:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:54.203412Z", "start_time": "2021-10-13T07:15:54.184414Z" } }, "outputs": [], "source": [ "def extract_date_features(df, date_column):\n", " df_temp = df.copy()\n", " df_temp[date_column + 'Quarter'] = df_temp[date_column].dt.quarter\n", " df_temp[date_column + 'Month'] = df_temp[date_column].dt.month\n", " df_temp[date_column + 'Week'] = df_temp[date_column].dt.isocalendar().week\n", " # poniżej zwracany rozkład to 0-6, dodajemy 1 aby przejsc na bardziej intuicyjne wrtości 1-7\n", " df_temp[date_column + 'WeekDay'] = df_temp[date_column].dt.dayofweek + 1 \n", " df_temp[date_column + 'YearDay'] = df_temp[date_column].dt.dayofyear\n", " df_temp[date_column + 'isWeekend'] = np.where(df_temp[date_column + 'WeekDay']>5,1,0)\n", " return df_temp" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:54.836613Z", "start_time": "2021-10-13T07:15:54.737426Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SalesDateIceCreamSalesSalesDateQuarterSalesDateMonthSalesDateWeekSalesDateWeekDaySalesDateYearDaySalesDateisWeekend
02018-01-01253100111110
12018-01-02223200111220
22018-01-03173300111330
32018-01-04223400111440
42018-01-05223500111550
...........................
10912020-12-271347004125273621
10922020-12-281431004125313630
10932020-12-29932004125323640
10942020-12-30733004125333650
10952020-12-311334004125343660
\n", "

1096 rows × 8 columns

\n", "
" ], "text/plain": [ " SalesDate IceCreamSales SalesDateQuarter SalesDateMonth \\\n", "0 2018-01-01 253100 1 1 \n", "1 2018-01-02 223200 1 1 \n", "2 2018-01-03 173300 1 1 \n", "3 2018-01-04 223400 1 1 \n", "4 2018-01-05 223500 1 1 \n", "... ... ... ... ... \n", "1091 2020-12-27 134700 4 12 \n", "1092 2020-12-28 143100 4 12 \n", "1093 2020-12-29 93200 4 12 \n", "1094 2020-12-30 73300 4 12 \n", "1095 2020-12-31 133400 4 12 \n", "\n", " SalesDateWeek SalesDateWeekDay SalesDateYearDay SalesDateisWeekend \n", "0 1 1 1 0 \n", "1 1 2 2 0 \n", "2 1 3 3 0 \n", "3 1 4 4 0 \n", "4 1 5 5 0 \n", "... ... ... ... ... \n", "1091 52 7 362 1 \n", "1092 53 1 363 0 \n", "1093 53 2 364 0 \n", "1094 53 3 365 0 \n", "1095 53 4 366 0 \n", "\n", "[1096 rows x 8 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "IceCream_df_extended = extract_date_features(IceCream_df,\"SalesDate\")\n", "IceCream_df_extended" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cechy powstałe przez przesunięcie w czasie" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Analizując wykres można zaobserwować, że sprzedaż lodów nie jest liniowo zależna od zmiennych takich jak numer kwartału, numer miesiąca czy numer tygodnia, aby uzyskać lepsze wyniki warto zbudować cechy w oparciu o przesunięte w czasie wartości zmiennej celu." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Uwaga! \n", " \n", "Przy korzystaniu ze zmiennych przesuniętych w czasie, w szczególności opartych o wcześniejsze wartości zmiennej celu nalezy zawsze wziąc pod uwagę jakie dane będziemy mieli dostępne na moment predykcji, inaczej możemy popełnić jeden z najczęstszych błędów czyli data leakage. \n", "Przy założeniu, że mamy przewidywać sprzedaż lodów np na rok do przodu wykorzystanie sprzedaży lodów z dnia poprzedniego stanowi data leakage, ponieważ ta informacja nie będzie dostępna na moment predykcji w tej samej formie. Moglibyśmy natomiast uwzględnić sprzedaż lodów sprzed roku, jako, że ta informacja będzie dostępna w tej samej formie.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tutaj dla uproszczenia zakładamy chwilowo, że horyzont predykcji to tylko 1 dzień do przodu, co pozwoli zaprezentować większy zakres zmiennych przesuniętych w czasie." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:57.805667Z", "start_time": "2021-10-13T07:15:57.788095Z" } }, "outputs": [], "source": [ "def get_shifted_target_values(df, lag_values, date_column, target_column):\n", " df_temp = df.copy()\n", " df_temp =df_temp.sort_values(by=date_column)\n", " for lag in lag_values:\n", " df_temp[target_column +\"_lagged_\" + str(lag)] = df_temp[target_column].shift(lag)\n", " return df_temp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Uwzględniając, że przewidujemy z horyzontem czasowym tylko na dzień w przód, pierwszym kandydatem na wartość przesunięcia jest 1 dzień, jako, że w danych o charakterze szeregu czasowego podobieństwo kolejnych obserwacji będzie siłą rzeczy relatywnie wysokie. Z analizy wykresu można łatwo wywnioskować, że wartośc przesunięcia 365 dni również będzie miała dużą siłę predykcyjną. Ponadto można tutaj wypróbować 7 dni co powinno być przydatne w przypadku tygodniowej sezonowości danych" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:15:59.183156Z", "start_time": "2021-10-13T07:15:59.131159Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SalesDateIceCreamSalesSalesDateQuarterSalesDateMonthSalesDateWeekSalesDateWeekDaySalesDateYearDaySalesDateisWeekendIceCreamSales_lagged_1IceCreamSales_lagged_7IceCreamSales_lagged_365
02018-01-01253100111110<NA><NA><NA>
12018-01-02213200111220253100<NA><NA>
22018-01-03193300111330213200<NA><NA>
32018-01-04253400111440193300<NA><NA>
42018-01-05213500111550253400<NA><NA>
....................................
10912020-12-271547004125273621144600233700114600
10922020-12-28731004125313630154700194100124700
10932020-12-296320041253236407310015420083100
10942020-12-30143300412533365063200164300143200
10952020-12-311034004125343660143300184400203300
\n", "

1096 rows × 11 columns

\n", "
" ], "text/plain": [ " SalesDate IceCreamSales SalesDateQuarter SalesDateMonth \\\n", "0 2018-01-01 253100 1 1 \n", "1 2018-01-02 213200 1 1 \n", "2 2018-01-03 193300 1 1 \n", "3 2018-01-04 253400 1 1 \n", "4 2018-01-05 213500 1 1 \n", "... ... ... ... ... \n", "1091 2020-12-27 154700 4 12 \n", "1092 2020-12-28 73100 4 12 \n", "1093 2020-12-29 63200 4 12 \n", "1094 2020-12-30 143300 4 12 \n", "1095 2020-12-31 103400 4 12 \n", "\n", " SalesDateWeek SalesDateWeekDay SalesDateYearDay SalesDateisWeekend \\\n", "0 1 1 1 0 \n", "1 1 2 2 0 \n", "2 1 3 3 0 \n", "3 1 4 4 0 \n", "4 1 5 5 0 \n", "... ... ... ... ... \n", "1091 52 7 362 1 \n", "1092 53 1 363 0 \n", "1093 53 2 364 0 \n", "1094 53 3 365 0 \n", "1095 53 4 366 0 \n", "\n", " IceCreamSales_lagged_1 IceCreamSales_lagged_7 IceCreamSales_lagged_365 \n", "0 \n", "1 253100 \n", "2 213200 \n", "3 193300 \n", "4 253400 \n", "... ... ... ... \n", "1091 144600 233700 114600 \n", "1092 154700 194100 124700 \n", "1093 73100 154200 83100 \n", "1094 63200 164300 143200 \n", "1095 143300 184400 203300 \n", "\n", "[1096 rows x 11 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "IceCream_df_extended = get_shifted_target_values(IceCream_df_extended, [1,7,365], \"SalesDate\",\"IceCreamSales\")\n", "IceCream_df_extended" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Widzimy, że początek zbioru danych zawiera teraz wartości puste, ze względu na fakt, że dla wartości z roku 2018 nie istniały obserwacje cofnięte o rok. Do pokazywania liczby niepustych wartości w ramce danych przydatna jest funkcja info z biblioteki pandas" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:00.709833Z", "start_time": "2021-10-13T07:16:00.680833Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Int64Index: 1096 entries, 0 to 1095\n", "Data columns (total 11 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 SalesDate 1096 non-null datetime64[ns]\n", " 1 IceCreamSales 1096 non-null Int64 \n", " 2 SalesDateQuarter 1096 non-null int64 \n", " 3 SalesDateMonth 1096 non-null int64 \n", " 4 SalesDateWeek 1096 non-null UInt32 \n", " 5 SalesDateWeekDay 1096 non-null int64 \n", " 6 SalesDateYearDay 1096 non-null int64 \n", " 7 SalesDateisWeekend 1096 non-null int32 \n", " 8 IceCreamSales_lagged_1 1095 non-null Int64 \n", " 9 IceCreamSales_lagged_7 1089 non-null Int64 \n", " 10 IceCreamSales_lagged_365 731 non-null Int64 \n", "dtypes: Int64(4), UInt32(1), datetime64[ns](1), int32(1), int64(4)\n", "memory usage: 99.5 KB\n" ] } ], "source": [ "IceCream_df_extended.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "oczywiście wartości puste należy potem w jakiś sposób obsłużyć, poprzez ich usunięcie lub imputację" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Info \n", "\n", "Tworząc zmienne oparte o cechy przesunięte w czasie warto mieć na uwadze, że dane historyczne mogą zawierać wartości odstające. Dlatego zamiast brać wprost wartość sprzed np. 365 dni można rozważyć wygładzenie wartości stosując medianę z 5 dniowego okna, którego środek stanowi wartość sprzed 365 dni.\n", "
" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-11T12:30:06.208232Z", "start_time": "2021-10-11T12:30:06.192598Z" } }, "source": [ "# Cechy kategoryczne i ich transformacje" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dla zilustrowania transformacji na zmiennych kategorycznych posłużymy się drugim z przygotowanych zbiorów danych, gdzie chcemy przewidzieć cenę sprzedaży używanego samochodu." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:04.773577Z", "start_time": "2021-10-13T07:16:04.754574Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
selling_priceconditionmileagebrandyear_manufactured
032123.0good129627Mercedes1996
162394.0medium68446Bugatti2013
28746.0medium218559Fiat1987
39193.0good573386Skoda1952
412340.0good27153Fiat2005
\n", "
" ], "text/plain": [ " selling_price condition mileage brand year_manufactured\n", "0 32123.0 good 129627 Mercedes 1996\n", "1 62394.0 medium 68446 Bugatti 2013\n", "2 8746.0 medium 218559 Fiat 1987\n", "3 9193.0 good 573386 Skoda 1952\n", "4 12340.0 good 27153 Fiat 2005" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "UsedCars_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "jak widzimy występują tutaj 2 cechy kategoryczne condition oraz brand, na podstawie których zaprezentujemy które transformacje danych najlepiej zastosować w którym przypadku. Aby umożliwić wykorzystanie tych cech w predykcji niezbędne jest odpowiednie ich przekształcenie w wartości numeryczne" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:06.297398Z", "start_time": "2021-10-13T07:16:06.279408Z" } }, "outputs": [ { "data": { "text/plain": [ "array(['good', 'medium', 'bad', 'very_good', 'very_bad'], dtype=object)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "UsedCars_df.condition.unique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "patrząc na atrybuty zmiennej condition widzimy, że ma ona charakter porządkowy - jesteśmy w stanie łatwo ustalić naturalną kolejność jej atrybutów. Stanowi ona zatem dobrego kandydata do zastosowania kodowania porządkowego" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-11T12:47:35.578945Z", "start_time": "2021-10-11T12:47:35.566890Z" } }, "source": [ "
\n", "Definicja \n", "\n", "kodowania porządkowe (ang. *Ordinal encoding*) - reprezentacja każdego atrybutu kodowanej zmiennej jako kolejnej liczby naturalnej \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "poniżej zaprezentujemy kodowanie porządkowe z użyciem transformera OrdinalEncoder, najpierw jednak podzielimy nasze dane na zbiór treningowy i testowy, aby lepiej odwzorować to, że dane treningowe są oddzielone od danych produkcyjnych, na których model będzie potem stosowany." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:22.871995Z", "start_time": "2021-10-13T07:16:10.112336Z" } }, "outputs": [], "source": [ "from sklearn.preprocessing import OrdinalEncoder\n", "from sklearn.model_selection import train_test_split" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "tutaj dla uproszczenia stosujemy tylko prosty podział na zbiór treningowy i testowy, generalnie najlepszą praktyką jest wydzielenie osobnego zbioru testowego reprezentującego zdolność modelu do generalizacji na nowych, niewidzianych wcześniej danych i dobór najlepszego zestawu parametrów i transformacji stosując crosswalidację na zbiorze treningowym." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:23.275504Z", "start_time": "2021-10-13T07:16:23.261497Z" } }, "outputs": [], "source": [ "X_train, X_test = train_test_split(UsedCars_df, test_size =0.25, random_state=42)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "następnie tworzymy obiekt klasy OrdinalEncoder, określamy tutaj porządek cechy atrybutów cechy, którą chcemy przetransformować, inaczej mogą one zostać po prostu posortowane alfabetycznie co najczęściej nie będzie odpowiadało ich znaczeniu biznesowemu" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:23.894916Z", "start_time": "2021-10-13T07:16:23.860918Z" } }, "outputs": [], "source": [ "oe= OrdinalEncoder(categories =[['very_bad', 'bad', 'medium', 'good', 'very_good']],\n", " handle_unknown ='use_encoded_value', unknown_value=np.NaN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Uwaga! \n", " \n", "Kodując atrybuty należy mieć świadomość, że na nowych danych mogą pojawić się niewidziane wcześniej wartości, które należy w jakiś sposób obsłużyć. Domyślnym zachowaniem OrdinalEncoder w takiej sytuacji jest zwrócenie wyjątku, tutaj skorzystaliśmy z przypisania mu ustalonej wartości, gdzie wybraliśmy przypisanie wartości pustej. Następnie taką wartość można zastąpić np. dominantą ze zbioru treningowego, lub przypisać jej wartość neutralną, którą tutaj byłoby 2 odpowiadające kategorii medium.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zdecydowanie najlepszym sposobem użycia wszystkich transformerów jest skorzystanie z pipeline, co zostanie zaprezentowane potem. Tutaj zaprezentujemy najprostsze wykorzystanie polegające na skorzystaniu z metod fit i transform. OrdinalEncoder stosujemy tylko do przekształcenia jednej cechy, gdyby było inaczej moglibyśmy wykonać fit na całym zbiorze treningowym a następnie przetransformować zbiory treningowy i testowy." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:24.439446Z", "start_time": "2021-10-13T07:16:24.425440Z" } }, "outputs": [], "source": [ "oe.fit(X_train.condition.values.reshape(-1, 1))\n", "X_train[\"condition_transformed\"] = oe.transform(X_train.condition.values.reshape(-1, 1))\n", "X_test[\"condition_transformed\"] = oe.transform(X_test.condition.values.reshape(-1, 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Uwaga! \n", " \n", "Jeśli nie korzystamy z pipeline należy zwrócić szczególną uwagę żeby metody fit używać tylko na zbiorze treningowym a następnie mając już \"nauczony\" transformer stosować metodę transform na pozostałych zbiorach. Inaczej może dojść do przecieku informacji ze zbioru testowego.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "możemy jeszcze sprawdzić czy przypisanie atrybutów na zbiorach treningowym i testowym jest prawidłowe, a następnie pozbyć się pierwotnej kolumny, wartości pierwotne mogą być łatwo odzyskane z przetransformowanych danych stosując metodę inverse_transform" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:24.997502Z", "start_time": "2021-10-13T07:16:24.973502Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
conditioncondition_transformed
323very_bad0.0
894bad1.0
82medium2.0
991good3.0
398very_good4.0
\n", "
" ], "text/plain": [ " condition condition_transformed\n", "323 very_bad 0.0\n", "894 bad 1.0\n", "82 medium 2.0\n", "991 good 3.0\n", "398 very_good 4.0" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train[[\"condition\",\"condition_transformed\"]].drop_duplicates().sort_values(by=\"condition_transformed\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:25.785826Z", "start_time": "2021-10-13T07:16:25.749495Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
conditioncondition_transformed
346very_bad0.0
521bad1.0
740medium2.0
513good3.0
737very_good4.0
\n", "
" ], "text/plain": [ " condition condition_transformed\n", "346 very_bad 0.0\n", "521 bad 1.0\n", "740 medium 2.0\n", "513 good 3.0\n", "737 very_good 4.0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_test[[\"condition\",\"condition_transformed\"]].drop_duplicates().sort_values(by=\"condition_transformed\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:26.610243Z", "start_time": "2021-10-13T07:16:26.595250Z" } }, "outputs": [], "source": [ "X_train.drop([\"condition\"],axis=1, inplace=True)\n", "X_test.drop([\"condition\"],axis=1, inplace=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:27.463826Z", "start_time": "2021-10-13T07:16:27.441818Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
selling_pricemileagebrandyear_manufacturedcondition_transformed
827986.0524486VW19562.0
99110531.0166856Toyota19963.0
7899532.094191Skoda20002.0
8947266.054210VW19541.0
39811133.0264049Skoda19854.0
..................
10631713.0127914Mercedes19903.0
2709918.0185880Seat19623.0
8604824.0116011VW20070.0
43511329.025782Skoda20142.0
1028860.0145116Skoda19792.0
\n", "

750 rows × 5 columns

\n", "
" ], "text/plain": [ " selling_price mileage brand year_manufactured \\\n", "82 7986.0 524486 VW 1956 \n", "991 10531.0 166856 Toyota 1996 \n", "789 9532.0 94191 Skoda 2000 \n", "894 7266.0 54210 VW 1954 \n", "398 11133.0 264049 Skoda 1985 \n", ".. ... ... ... ... \n", "106 31713.0 127914 Mercedes 1990 \n", "270 9918.0 185880 Seat 1962 \n", "860 4824.0 116011 VW 2007 \n", "435 11329.0 25782 Skoda 2014 \n", "102 8860.0 145116 Skoda 1979 \n", "\n", " condition_transformed \n", "82 2.0 \n", "991 3.0 \n", "789 2.0 \n", "894 1.0 \n", "398 4.0 \n", ".. ... \n", "106 3.0 \n", "270 3.0 \n", "860 0.0 \n", "435 2.0 \n", "102 2.0 \n", "\n", "[750 rows x 5 columns]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "widzimy, że do zakodowania pozostała nam jeszcze cecha - brand, w odróżnieniu od poprzednio rozważanej cechy tutaj nie ma oczywistego naturalnego porządku, dlatego należy tutaj zastosować inne podejście" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Definicja \n", "\n", "kodowania 1 z n (ang. *One-hot encoding*) - reprezentacja każdego atrybutu kodowanej zmiennej jako osobnej zmiennej binarnej, gdzie występowanie rozważanego atrybutu dla danej obserwacji oznaczane jest jako 1 a wszystkie pozostałe atrybuty oznaczane są jako 0 \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "kodowanie 1 z n stanowi jeden z najczęściej używanych i najbardziej intuicyjnych sposobów kodowania, jednak jego główną wadą jest zwiększanie wymiarowości danych, co zaraz zaprezentujemy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "najpierw pokażemy jak posługiwać się transformerem OneHotEncoder" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:31.358006Z", "start_time": "2021-10-13T07:16:31.349906Z" } }, "outputs": [], "source": [ "from sklearn.preprocessing import OneHotEncoder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "tworzymy obiekt klasy OneHotEncoder, podobnie jak w przypadku poprzedniego transformera, tu także domyślnym sposobem obsługi nieznanych atrybutów jest zwracanie wyjątku, my wybieramy handle_unknown=\"ignore\" co sprawi, że nieznane atrybuty reprezentowane będą po prostu jako 0 we wszystkich zakodowanych kolumnach.\n", "\n", "Natomiast ustawienie sparse=False sprawia, że zwracane dane będą typu np.array zamiast domyślnego sparse matrix" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:32.849003Z", "start_time": "2021-10-13T07:16:32.841484Z" } }, "outputs": [], "source": [ "ohe = OneHotEncoder(handle_unknown=\"ignore\",sparse=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "należy zwrócić uwagę, że we wszystkich transformerach z biblioteki sklearn stosowane jest to samo API, w związku z tym tutaj analogicznie jak w poprzednim przypadku możemy skorzystać z metod fit i transform" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:34.371505Z", "start_time": "2021-10-13T07:16:34.354961Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "rozmiar zakodowanej kolumny brand na danych treningowych to: (750, 10)\n", "rozmiar zakodowanej kolumny brand na danych testowych to: (250, 10)\n", "[[0. 0. 0. ... 0. 0. 1.]\n", " [0. 0. 0. ... 0. 1. 0.]\n", " [0. 0. 0. ... 1. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 1.]\n", " [0. 0. 0. ... 1. 0. 0.]\n", " [0. 0. 0. ... 1. 0. 0.]]\n" ] } ], "source": [ "ohe.fit(X_train.brand.values.reshape(-1, 1))\n", "brand_transformed_train = ohe.transform(X_train.brand.values.reshape(-1, 1))\n", "brand_transformed_test = ohe.transform(X_test.brand.values.reshape(-1, 1))\n", "print(f\"rozmiar zakodowanej kolumny brand na danych treningowych to: {brand_transformed_train.shape}\")\n", "print(f\"rozmiar zakodowanej kolumny brand na danych testowych to: {brand_transformed_test.shape}\")\n", "print(brand_transformed_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "jak widzimy kolumna brand reprezentowana jest teraz jako array gdzie każdy atrybut ze zbioru treningowego zaprezentowany jest w osobnej kolumnie binarnej. Można to sprawdzić zliczając liczbę unikalnych atrybutów tej kolumny na zbiorze treningowym" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:35.963830Z", "start_time": "2021-10-13T07:16:35.957828Z" } }, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.brand.nunique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "kolejność atrybutów odpowiadających kolumnom wynikowego arraya można zobaczyć korzystając z atrybutu categories_" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:37.722373Z", "start_time": "2021-10-13T07:16:37.709372Z" } }, "outputs": [ { "data": { "text/plain": [ "[array(['Audi', 'BMW', 'Bugatti', 'Fiat', 'Mercedes', 'Renault', 'Seat',\n", " 'Skoda', 'Toyota', 'VW'], dtype=object)]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ohe.categories_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "całą transformację wraz z dodaniem przetransformowanej zmiennej do zbioru treningowego można zrealizować za pomocą prostej funkcji" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:39.641779Z", "start_time": "2021-10-13T07:16:39.632782Z" } }, "outputs": [], "source": [ "def OneHotEncode(X_train, X_test, encoded_column_name, **encoder_kwargs):\n", " \n", " ohe = OneHotEncoder(**encoder_kwargs)\n", " ohe.fit(X_train[encoded_column_name].values.reshape(-1, 1))\n", " transformed_train = ohe.transform(X_train[encoded_column_name].values.reshape(-1, 1))\n", " transformed_test = ohe.transform(X_test[encoded_column_name].values.reshape(-1, 1))\n", " \n", " column_names = [encoded_column_name +\"_\"+category for category in list(ohe.categories_[0]) ]\n", " df_transformed_train = pd.DataFrame(transformed_train, columns = column_names)\n", " df_transformed_test = pd.DataFrame(transformed_test, columns = column_names)\n", " \n", " df_out_train = X_train.reset_index(drop=True).drop([encoded_column_name], axis=1)\n", " df_out_test = X_test.reset_index(drop=True).drop([encoded_column_name], axis=1)\n", " df_out_train = pd.concat([df_out_train, df_transformed_train],axis=1)\n", " df_out_test = pd.concat([df_out_test, df_transformed_test],axis=1)\n", " \n", " return df_out_train, df_out_test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "powyższa funkcja zwraca zbiór treningowy i testowy po dodaniu odpowiednio nazwanych kolumn powstałych po transformacji obiektem OneHotEncoder i usunięciu pierwotnej zmiennej. Argumenty do OneHotEncoder przekazywane są z pomocą **encoder_kwargs" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:41.132045Z", "start_time": "2021-10-13T07:16:41.085522Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
selling_pricemileageyear_manufacturedcondition_transformedbrand_Audibrand_BMWbrand_Bugattibrand_Fiatbrand_Mercedesbrand_Renaultbrand_Seatbrand_Skodabrand_Toyotabrand_VW
07986.052448619562.00.00.00.00.00.00.00.00.00.01.0
110531.016685619963.00.00.00.00.00.00.00.00.01.00.0
29532.09419120002.00.00.00.00.00.00.00.01.00.00.0
37266.05421019541.00.00.00.00.00.00.00.00.00.01.0
411133.026404919854.00.00.00.00.00.00.00.01.00.00.0
\n", "
" ], "text/plain": [ " selling_price mileage year_manufactured condition_transformed \\\n", "0 7986.0 524486 1956 2.0 \n", "1 10531.0 166856 1996 3.0 \n", "2 9532.0 94191 2000 2.0 \n", "3 7266.0 54210 1954 1.0 \n", "4 11133.0 264049 1985 4.0 \n", "\n", " brand_Audi brand_BMW brand_Bugatti brand_Fiat brand_Mercedes \\\n", "0 0.0 0.0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 0.0 0.0 \n", "3 0.0 0.0 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 0.0 0.0 \n", "\n", " brand_Renault brand_Seat brand_Skoda brand_Toyota brand_VW \n", "0 0.0 0.0 0.0 0.0 1.0 \n", "1 0.0 0.0 0.0 1.0 0.0 \n", "2 0.0 0.0 1.0 0.0 0.0 \n", "3 0.0 0.0 0.0 0.0 1.0 \n", "4 0.0 0.0 1.0 0.0 0.0 " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train_ohe, X_test_ohe = OneHotEncode(X_train, X_test, \"brand\", handle_unknown=\"ignore\",sparse=False)\n", "X_train_ohe.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Info \n", "\n", "Alternatywnie zamiast OneHotEncoder można wykorzystać funkcję get_dummies z biblioteki pandas, która jest nieco prostsza w użyciu, jednak OneHotEncoder jest lepiej dostosowany do obsługi niewidzianych wartości a ponadto znacznie łatwiej go zastosować w ramach pipeline\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "jak widzimy nawet przy tak niskiej liczbie atrybutów wymiarowość naszych danych znacznie wzrosła. W prawdziwych zastosowaniach możemy się spotkać ze zbiorami danych mającymi wiele zmiennych kategorycznych o dziesiątkach lub setkach unikalnych atrybutów, więc metodę OneHotEncoder zaleca się stosować tylko tam, gdzie atrybuty są niezbyt liczne, w pozostałych sytuacjach lepiej skorzystać z kodowania zmienną celu" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T09:05:01.108185Z", "start_time": "2021-10-12T09:05:01.092691Z" } }, "source": [ "
\n", "Definicja \n", "\n", "kodowanie zmienną celu (ang. *Target encoding*) - reprezentacja każdego atrybutu kodowanej zmiennej jako estymata średniej wartości zmiennej celu na danych treningowych\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Kodowanie zmienną celu stanowi jedną z najbardziej uniwersalnych metod kodowania zmiennych kategorycznych, nie wymaga naturalnego porządku w danych jak kodowanie porządkowe i nie zwiększa wymiarowości danych jak kodowanie 1 z n.\n", "\n", "Istnieje wiele różnych sposobów kodowania zmiennej celu, my tutaj posłużymy się metodą James-Stein Encoder dostępną w bibliotece category_encoders" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T09:15:40.326427Z", "start_time": "2021-10-12T09:15:40.319428Z" } }, "source": [ "
\n", "Definicja \n", "\n", "Formuła na zakodowaną wartość k-tego atrybutu kodowanej zmiennej:\n", "$$\n", "X_{k} = (1-B) *Avg(Y_{k}) +B*Avg(Y)\n", "$$\n", "\n", " \n", "gdzie:\n", " \n", "$X_{k}$ - wartość przypisana k-temu atrybutowi kodowanej zmiennej kategorycznej\n", " \n", "$Avg(Y_{k})$ - średnia wartości zmiennej celu dla k-tego atrybutu zmiennej kategorycznej\n", " \n", "$Avg(Y)$ - globalna średnia zmiennej celu na zbiorze treningowym\n", " \n", "$B$ -waga globalnej średniej, wyliczona według formuły:\n", "$$\n", "B = \\frac{Var(Y_{k})}{Var(Y) + Var(Y_{k})}\n", "$$\n", "gdzie:\n", "\n", "$Var(Y_{k})$ - wariancja zmiennej celu dla k-tego atrybutu zmiennej kategorycznej\n", "\n", "$Var(Y)$ - wariancja zmiennej celu dla całego zbioru treningowego" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "importujemy potrzebną klasę" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:47.637140Z", "start_time": "2021-10-13T07:16:46.169136Z" } }, "outputs": [], "source": [ "from category_encoders.james_stein import JamesSteinEncoder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "tworzymy obiekt klasy JamesSteinEncoder, wybierając kolumnę brand do przekształcenia, domyślnie przekształcone zostaną wszystkie kolumny kategoryczne" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:48.554893Z", "start_time": "2021-10-13T07:16:48.542897Z" } }, "outputs": [], "source": [ "jse = JamesSteinEncoder(cols=[\"brand\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "tak jak w transformerach z biblioteki sklearn także tutaj posługujemy się metodami fit i transform, jednak jako, że jest to kodowanie zmienną celu niezbędne jest jej podanie do metody fit, dlatego najpierw wydzielimy zmienną celu" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:49.316898Z", "start_time": "2021-10-13T07:16:49.305893Z" } }, "outputs": [], "source": [ "y_train = X_train.selling_price\n", "y_test = X_test.selling_price\n", "X_train = X_train.drop(\"selling_price\",axis=1)\n", "X_test = X_test.drop(\"selling_price\",axis=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:50.323299Z", "start_time": "2021-10-13T07:16:50.254236Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagebrandyear_manufacturedcondition_transformed
825244869530.00970719562.0
99116685610018.69139819963.0
789941919636.70000120002.0
894542109530.00970719541.0
3982640499636.70000119854.0
\n", "
" ], "text/plain": [ " mileage brand year_manufactured condition_transformed\n", "82 524486 9530.009707 1956 2.0\n", "991 166856 10018.691398 1996 3.0\n", "789 94191 9636.700001 2000 2.0\n", "894 54210 9530.009707 1954 1.0\n", "398 264049 9636.700001 1985 4.0" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "jse.fit(X_train,y_train)\n", "X_train_jse = jse.transform(X_train)\n", "X_test_jse = jse.transform(X_test)\n", "X_train_jse.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "jak widzimy zmienna brand została teraz zastąpiona estymatami średniej wartości zmiennej celu w zależności od brandu" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Łączenie atrybutów cech kategorycznych" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Oprócz standardowych metod transformacji zmiennych kategorycznych opisanych w poprzedniej sekcji można też stosować różne przekształcenia polegające na łączeniu pierwotnych atrybutów w podgrupy. Takie łączenie może być oparte na podobieństwie atrybutów pod katęm statystycznym np. zbliżony poziom średniej wartości zmiennej celu lub, co bardziej zalecane - na wiedzy domenowej." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tutaj zaprezentujemy prosty przykład łączenia atrybutów oparty na wiedzy domenowej - załóżmy, że znamy podział wszystkich marek samochodów ze zmiennej brand na 3 relatywnie jednolite podgrupy - marki podstawowe, marki premium i marki luksusowe. Na tej podstawie stworzymy nową zmienną korzystając z prostej funkcji:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:54.379596Z", "start_time": "2021-10-13T07:16:54.368589Z" } }, "outputs": [], "source": [ "def brand_binning(brand):\n", " result =\"standard\"\n", " standard_brands = [\"Fiat\",\"Renault\",\"VW\", \"Seat\", \"Skoda\",\"Toyota\"]\n", " premium_brands = [\"Audi\",\"BMW\",\"Mercedes\"]\n", " luxury_brands = [\"Bugatti\"]\n", " if brand in luxury_brands:\n", " result = \"luxury\"\n", " elif brand in premium_brands:\n", " result = \"premium\"\n", " return result" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:55.433592Z", "start_time": "2021-10-13T07:16:55.399599Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagebrandyear_manufacturedcondition_transformedbrand_binned
82524486VW19562.0standard
991166856Toyota19963.0standard
78994191Skoda20002.0standard
89454210VW19541.0standard
398264049Skoda19854.0standard
\n", "
" ], "text/plain": [ " mileage brand year_manufactured condition_transformed brand_binned\n", "82 524486 VW 1956 2.0 standard\n", "991 166856 Toyota 1996 3.0 standard\n", "789 94191 Skoda 2000 2.0 standard\n", "894 54210 VW 1954 1.0 standard\n", "398 264049 Skoda 1985 4.0 standard" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train[\"brand_binned\"] = X_train[\"brand\"].map(lambda x:brand_binning(x))\n", "X_test[\"brand_binned\"] = X_test[\"brand\"].map(lambda x:brand_binning(x))\n", "X_train.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "możemy też sprawdzić jak wygląda unikalne przypisanie pomiędzy pierwotną a zgrupowaną zmienną:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:16:56.678205Z", "start_time": "2021-10-13T07:16:56.663102Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
brandbrand_binned
5Bugattiluxury
323Audipremium
798Mercedespremium
717BMWpremium
82VWstandard
991Toyotastandard
789Skodastandard
731Fiatstandard
97Renaultstandard
523Seatstandard
\n", "
" ], "text/plain": [ " brand brand_binned\n", "5 Bugatti luxury\n", "323 Audi premium\n", "798 Mercedes premium\n", "717 BMW premium\n", "82 VW standard\n", "991 Toyota standard\n", "789 Skoda standard\n", "731 Fiat standard\n", "97 Renault standard\n", "523 Seat standard" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train[[\"brand\",\"brand_binned\"]].drop_duplicates().sort_values(by=\"brand_binned\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "jak widzimy przypisanie zostało przeprowadzone poprawnie, nowa zmienna niesie mniej informacji niż zmienna pierwotna, dlatego zastąpienie nią pierwotnej zmiennej może być pomocne jeśli mamy problem z przeuczeniem modelu. Oczywiście tak powstałą zmienną należy potem jeszcze przetransformować zgodnie z wytycznymi z poprzedniej sekcji." ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T10:12:01.320269Z", "start_time": "2021-10-12T10:12:01.311270Z" } }, "source": [ "# Cechy oparte na wiedzy domenowej oraz cechy interakcji" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zaprezentowane powyżej grupowanie marek polegało na przekształceniu zmiennej kategorycznej w oparciu o wiedzę domenową. Tutaj pokażemy przykłady zastosowania wiedzy domenowej na zmiennych numerycznych i interakcji cech numerycznych i katgorycznych." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Przykładem prostej cechy opartej na wiedzy domenowej może być wiek samochodu w momencie sprzedaży. Nie mamy tutaj informacji o dacie transakcji, dlatego można dla ułatwienia założyć, że wszystkie transakcje odbyły się w bieżącym roku." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:00.413063Z", "start_time": "2021-10-13T07:17:00.375401Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagebrandyear_manufacturedcondition_transformedbrand_binnedage
82524486VW19562.0standard65
991166856Toyota19963.0standard25
78994191Skoda20002.0standard21
89454210VW19541.0standard67
398264049Skoda19854.0standard36
.....................
106127914Mercedes19903.0premium31
270185880Seat19623.0standard59
860116011VW20070.0standard14
43525782Skoda20142.0standard7
102145116Skoda19792.0standard42
\n", "

750 rows × 6 columns

\n", "
" ], "text/plain": [ " mileage brand year_manufactured condition_transformed brand_binned \\\n", "82 524486 VW 1956 2.0 standard \n", "991 166856 Toyota 1996 3.0 standard \n", "789 94191 Skoda 2000 2.0 standard \n", "894 54210 VW 1954 1.0 standard \n", "398 264049 Skoda 1985 4.0 standard \n", ".. ... ... ... ... ... \n", "106 127914 Mercedes 1990 3.0 premium \n", "270 185880 Seat 1962 3.0 standard \n", "860 116011 VW 2007 0.0 standard \n", "435 25782 Skoda 2014 2.0 standard \n", "102 145116 Skoda 1979 2.0 standard \n", "\n", " age \n", "82 65 \n", "991 25 \n", "789 21 \n", "894 67 \n", "398 36 \n", ".. ... \n", "106 31 \n", "270 59 \n", "860 14 \n", "435 7 \n", "102 42 \n", "\n", "[750 rows x 6 columns]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train[\"age\"] = 2021 - X_train[\"year_manufactured\"]\n", "X_test[\"age\"] = 2021 - X_test[\"year_manufactured\"]\n", "X_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zmienne interakcji można wygenerować stosując np. iloczyny poszczególnych zmiennych numerycznych, tutaj wydaje się to nie być najlepszy pomysł, ponieważ intuicyjnie czujemy, że np mnożenie przebiegu * rok produkcji nie będzie zbyt dobrą cechą predykcyjną. Można natomiast wyliczyć np średni roczny przebieg dzieląc przebieg przez dodany powyżej wiek samochodu." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:02.036080Z", "start_time": "2021-10-13T07:17:02.002080Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagebrandyear_manufacturedcondition_transformedbrand_binnedageavg_yearly_mileage
82524486VW19562.0standard658069.0
991166856Toyota19963.0standard256674.0
78994191Skoda20002.0standard214485.0
89454210VW19541.0standard67809.0
398264049Skoda19854.0standard367335.0
........................
106127914Mercedes19903.0premium314126.0
270185880Seat19623.0standard593151.0
860116011VW20070.0standard148286.0
43525782Skoda20142.0standard73683.0
102145116Skoda19792.0standard423455.0
\n", "

750 rows × 7 columns

\n", "
" ], "text/plain": [ " mileage brand year_manufactured condition_transformed brand_binned \\\n", "82 524486 VW 1956 2.0 standard \n", "991 166856 Toyota 1996 3.0 standard \n", "789 94191 Skoda 2000 2.0 standard \n", "894 54210 VW 1954 1.0 standard \n", "398 264049 Skoda 1985 4.0 standard \n", ".. ... ... ... ... ... \n", "106 127914 Mercedes 1990 3.0 premium \n", "270 185880 Seat 1962 3.0 standard \n", "860 116011 VW 2007 0.0 standard \n", "435 25782 Skoda 2014 2.0 standard \n", "102 145116 Skoda 1979 2.0 standard \n", "\n", " age avg_yearly_mileage \n", "82 65 8069.0 \n", "991 25 6674.0 \n", "789 21 4485.0 \n", "894 67 809.0 \n", "398 36 7335.0 \n", ".. ... ... \n", "106 31 4126.0 \n", "270 59 3151.0 \n", "860 14 8286.0 \n", "435 7 3683.0 \n", "102 42 3455.0 \n", "\n", "[750 rows x 7 columns]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train[\"avg_yearly_mileage\"] = np.round(X_train[\"mileage\"]/X_train[\"age\"])\n", "X_test[\"avg_yearly_mileage\"] = np.round(X_test[\"mileage\"]/X_test[\"age\"])\n", "X_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Innym przykładem zmiennej opartej stricte na wiedzy domenowej łączecej ze sobą informacje ze zmiennych numerycznych i kategorycznych mogła by być informacja o klasycznych modelach. Załóżmy, że modele luksusowych marek wyprodukowane przed 1970 rokiem są modelami klasycznymi i jeśli ich stan jest co najmniej dobry to ich cena jest znacznie wyższa niż by to wynikało z wieku auta, gdzie normalnie spodziewamy się ujemnej relacji z ceną sprzedaży." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:03.554608Z", "start_time": "2021-10-13T07:17:03.535315Z" } }, "outputs": [ { "data": { "text/plain": [ "0.0 739\n", "1.0 11\n", "Name: is_classic, dtype: int64" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.loc[(X_train.brand_binned==\"luxury\")&(X_train.year_manufactured<=1970)&(X_train.condition_transformed>2.0),\"is_classic\"]=1\n", "X_train[\"is_classic\"] = X_train[\"is_classic\"].fillna(0)\n", "X_test.loc[(X_test.brand_binned==\"luxury\")&(X_test.year_manufactured<=1970)&(X_test.condition_transformed>2.0),\"is_classic\"]=1\n", "X_test[\"is_classic\"] = X_test[\"is_classic\"].fillna(0)\n", "X_train[\"is_classic\"].value_counts()" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T10:57:29.776134Z", "start_time": "2021-10-12T10:57:29.751133Z" } }, "source": [ "Takie przypadki są stosunkowo rzadkie, ale tego typu zmienna może pomóc w dokładniejszym przewidzeniu tych obserwacji." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cechy oparte na transformacji zmiennych numerycznych" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dość powszechnie spotykaną praktyką jest stosowanie nieliniowych transformacji zmiennych numerycznych, co zazwyczaj sprzyja uzyskaniu lepszej jakości predykcji ze względu na fakt, że modele najlepiej radzą sobie gdy rozkłady zmiennych są zbliżone do rozkładu normalnego." ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T11:56:28.907518Z", "start_time": "2021-10-12T11:56:28.875293Z" } }, "source": [ "Często spotykaną jest po prostu logarytmowanie zmiennych numerycznych, tutaj natomiast posłużymy się gotowym transformerem z biblioteki sklearn, a mianowicie PowerTransformer" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:07.512038Z", "start_time": "2021-10-13T07:17:07.498042Z" } }, "outputs": [], "source": [ "from sklearn.preprocessing import PowerTransformer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "zanim dokonamy transformacji sprawdźmy jak wyglądają rozkłady zmiennych numerycznych, ograniczymy się tutaj do przebiegu, wieku i średniego przebiegu" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:09.592613Z", "start_time": "2021-10-13T07:17:08.864544Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[,\n", " ],\n", " [,\n", " ]], dtype=object)" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "num_columns = [\"mileage\", \"age\",\"avg_yearly_mileage\"]\n", "X_train[num_columns].hist(figsize=(15,9), bins=30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "można tu zaobserwować, że rozkład przebiegu jest silnie skośny, pozostałe 2 zmienne mają rozkład zbliżony do jednostajnego" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:10.658130Z", "start_time": "2021-10-13T07:17:10.645132Z" } }, "outputs": [], "source": [ "pt=PowerTransformer(standardize=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "tworzymy obiekt klasy PowerTransformer, korzystamy tutaj z domyślnej transformacji Yeo-Johnson, zmieniamy natomiast ustawienie o sprowadzeniu do rozkładu o średniej równej 0 i odchyleniu standardowym równym 1, które domyślnie jest ustawione na True" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Info \n", "\n", "Domyślna transformacja czyli metoda Yeo-Johnsona może być stosowana niezależnie od znaku transformowanych zmiennych, natomiast alternatywna transformacja Box-Cox wymaga ściśle dodatnich zmiennych na wejściu.\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:12.567395Z", "start_time": "2021-10-13T07:17:12.504256Z" } }, "outputs": [], "source": [ "pt.fit(X_train[num_columns])\n", "X_train_num_transformed = pd.DataFrame(pt.transform(X_train[num_columns]), columns =num_columns)\n", "X_test_num_transformed = pd.DataFrame(pt.transform(X_test[num_columns]), columns =num_columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "analogicznie jak przy poprzednio stosowanych transformerach korzystamy tutaj z metod fit i transform, a następnie konwertujemy wynik na ramkę danych." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Przeanalizujmy jak mocno zmieniły się rozkłady poszczególnych zmiennych:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:15.319229Z", "start_time": "2021-10-13T07:17:14.579501Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[,\n", " ],\n", " [,\n", " ]], dtype=object)" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2cAAAIYCAYAAADpSJTFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAA8g0lEQVR4nO3de5hkdXno++/rADIyyEVIn3EgNBFiNmF20HRQH3NpMCqCCZgYDh6ikGAmccs++DiJjuacqInJHrM3MSbx0YyBzRjRgaBs2CBRRDrEHAUZAYdLDBeHwGSY8QJIG7fuxvf8UauTou1LVVetqt+q/n6ep56udala72+t1bXqrd9lRWYiSZIkSRqupw07AEmSJEmSyZkkSZIkFcHkTJIkSZIKYHImSZIkSQUwOZMkSZKkApicSZIkSVIBTM6kNhHxwxExHRGrqumpiHj9sOOSJEnS6Ntn2AFIJcnMfwbWDDsOSZIkrTzWnEmSJElSAUzOtCJExM6I+J2I+HJEfDsiLoqIsYi4LiKeiIjPRMQhETEeERkR89YqR8SvR8Q9EfFoRHwqIo5qW/a+iHgoIr4VEdsj4mfalq2OiK3V6+6JiLdExMNty58dER+PiK9FxFcj4v+ud49IkjQ8EbEpIu6vrsF3R8SrqvmrIuLCiPh6dT08v/26HBEHVdfw3RGxKyLePdsVQRoFJmdaSX4ZeCnwo8AvANcBbwcOp/W/sGhCFBGnV+v/UvWavwc+1rbKF4ETgEOBjwJ/ExH7V8veAYwDP1LF8Ktt7/s04H8CdwDrgJcAb4qIly+3oJIkFe5+4GeAg4B3AR+JiLXAbwCvoHU9fT5wxpzXXQLMAMcAzwNeBtg3XCPD5EwryZ9n5p7M3EUrsbo5M2/LzP8FXEnrQ34xvwX8l8y8JzNngD8CTpitPcvMj2TmNzJzJjMvBJ4OPLd67ZnAH2Xmo5n5MPBnbe/7U8Dhmfn7mfm9zHwA+BBwVp/KLUlSUTLzbzLzXzLz+5l5GXAvcCKt6+X7MvPhzHwU2Dz7mogYA04F3pSZ387MvcB78XqpEeKAIFpJ9rQ9/84800sNBHIU8L6IuLBtXtCq7XowIn4bOA94NpDAM4HDqvWeDTzU9rr250cBz46Ix9rmraKVQEqSNHIi4nXAm2m1KoHWNfgwlr5e7gvsjojZeU+bs47UaCZnUuceAv4wMy+du6DqX/YWWk0S78rM70fEo7SSN4DdwBHA3dX0kXPe96uZeWxtkUuSVIiqxcmHaF0zP5+ZT0bE7bSumbPXy1lzr5ffBQ6rWrBII8dmjVLnPgi8LSJ+HP6tU/KvVMsOpNUG/mvAPhHxe7RqzmZdXr32kIhYB5zftuwW4ImIeGs1cMiqiDg+In6q9hJJkjR4B9BqYfI1gIj4NeD4atnlwAURsS4iDgbeOvuizNwNfBq4MCKeGRFPi4jnRMTPDTR6qUYmZ1KHMvNK4D3Atoj4FnAnrU7LAJ8C/hb4J+BB4H/x1GYWvw88DHwV+AxwBa1f/8jMJ4FX0ur8/FXg68Bf0eokLUnSSMnMu4ELgc/T6mKwHviHavGHaCVgXwZuAz5J68fPJ6vlrwP2o9US5VFa19O1g4pdqltk5rBjkFaciHgDcFZm+mufJEkLiIhXAB/MzKOWXFkaAdacSQMQEWsj4sVVE4znAhtpjRApSZIqVfP+UyNin6obwDvweqkVxJozaQCqzs/XAkcDjwHbgLdl5veGGZckSSWJiGcAfwf8GK2RlK8FLsjMbw01MGlATM4kSZIkqQA2a5QkSZKkApicSZIkSVIBBnoT6sMOOyzHx8cHuckf8O1vf5sDDjhgqDF0o0nxNilWMN66NSneJsUKg4l3+/btX8/Mw2vdiPqqhGtsHZr2/7kclrH5Rr18YBn7abFr7ECTs/HxcW699dZBbvIHTE1NMTk5OdQYutGkeJsUKxhv3ZoUb5NihcHEGxEP1roBPUVErAJuBXZl5isj4mhaAwc9C9gOvHapAYRKuMbWoWn/n8thGZtv1MsHlrGfFrvG2qxRkqThuwC4p236PcB7M/MYWjfaPW8oUUmSBsrkTJKkIYqII4DTgL+qpgM4GbiiWmUrcMZQgpMkDdRAmzVKkqQf8KfAW4ADq+lnAY9l5kw1/TCwbr4XRsQGYAPA2NgYU1NTtQY6DNPT0yNZrnaWsflGvXxgGQfF5EySpCGJiFcCezNze0RMdvv6zNwCbAGYmJjIUewPYj+X0TDqZRz18oFlHBSTM0mShufFwC9GxKnA/sAzgfcBB0fEPlXt2RHAriHGKEkaEPucSZI0JJn5tsw8IjPHgbOAz2bm2cCNwKur1c4BrhpSiJKkATI5kySpPG8F3hwR99Hqg3bRkOORJA2AzRolSSpAZk4BU9XzB4AThxmPJGnwTM6kETC+6dqO1925+bShv68kSRpdTfv+MBvvxvUznLtE7HXH23GzxohYFRG3RcQ11fTREXFzRNwXEZdFxH71hSlJkiRJo62bPmcXAPe0Tb8HeG9mHgM8CpzXz8AkSZIkaSXpKDmLiCOA04C/qqYDOBm4olplK3BGDfFJkiRJ0orQac3ZnwJvAb5fTT8LeKy6/wrAw8C6/oYmSZIkSSvHkgOCRMQrgb2ZuT0iJrvdQERsADYAjI2NMTU11e1b9NX09PTQY+hGk+ItPdYdux5/yvTYavjzS+e/ddD6dQcNIqSuLLZ/N66fmXf+fBYq8/zv2/GqPxBb6edDuybFCs2LV5IkdaaT0RpfDPxiRJwK7A88E3gfcHBE7FPVnh0B7JrvxZm5BdgCMDExkZOTk/2Ie9mmpqYYdgzdaFK8pcc6d/SdjetnuHDH/P8CO8+eHEBE3Vls/y41stAgzN1npZ8P7ZoUKzQvXkmS1JklmzVm5tsy84jMHAfOAj6bmWcDNwKvrlY7B+j853hJkiRJ0lN0M1rjXG8F3hwR99Hqg3ZRf0KSJEmSpJWnq5tQZ+YUMFU9fwA4sf8hSZIkSdLK00vNmSRJkiSpT0zOJEmSJKkAJmeSJEmSVACTM0mSJEkqgMmZJEmSJBWgq9EaJUmSJM1vfNO1Ha+7c/NpNUYymlbC/rXmTJIkSZIKYHImSdKQRMT+EXFLRNwREXdFxLuq+ZdExFcj4vbqccKQQ5UkDYDNGiVJGp7vAidn5nRE7At8LiKuq5b9TmZeMcTYJEkDZnImDdBKaCstqXOZmcB0Nblv9cjhRSRJGiaTM0mShigiVgHbgWOA92fmzRHxBuAPI+L3gBuATZn53XleuwHYADA2NsbU1NTgAh+Q6enpkSxXO8vYfLPl27h+puPX1LU/dux6vON11687qON1uzmGde2Hut93bPXS26j7PDY5kyRpiDLzSeCEiDgYuDIijgfeBjwC7AdsAd4K/P48r91SLWdiYiInJycHFPXgTE1NMYrlamcZm2+2fOd200Lm7MlaYqkrhm6OYV0x1P2+G9fPcOGOxdOjuo7bLAcEkSSpAJn5GHAjcEpm7s6W7wL/HThxqMFJkgbC5EySpCGJiMOrGjMiYjXwUuAfI2JtNS+AM4A7hxWjJGlwbNYoSdLwrAW2Vv3OngZcnpnXRMRnI+JwIIDbgd8aYoySpAExOZMkaUgy88vA8+aZf/IQwpEkDdmSzRq9QaYkSZIk1a+TmjNvkClJkiRJNVsyOfMGmZIkSZJUv476nI3SDTKbdhPEJsVbeqxzbyq42I0G6ypHLzdPXGz/dvO+dekm3tI0KVZoXrySJKkzHSVno3SDzKbdBLFJ8ZYe69wbFy52o8ESbwy52P7t5n3r0k28pWlSrNC8eCVJUme6us+ZN8iUJEmSpHp0MlqjN8iUJEmSpJp10qzRG2RKkiRJUs06Ga3RG2RKixgvoL/XKOtm/+7cfFqNkUiSJNWrqz5nkiRJkqR6mJxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRpSCJi/4i4JSLuiIi7IuJd1fyjI+LmiLgvIi6LiP2GHaskqX4mZ5IkDc93gZMz8yeAE4BTIuKFwHuA92bmMcCjwHnDC1GSNCgmZ5IkDUm2TFeT+1aPBE4GrqjmbwXOGHx0kqRB22fYAUiStJJFxCpgO3AM8H7gfuCxzJypVnkYWLfAazcAGwDGxsaYmpqqPd5Bm56eHslytZuvjDt2Pd7x69evO6jPEfXfqB/H2fJtXD+z9MqVuvZHXTF0cwzriqHu9x1bvfQ26j6PTc4kSRqizHwSOCEiDgauBH6si9duAbYATExM5OTkZB0hDtXU1BSjWK5285Xx3E3Xdvz6nWdPLrnOsI36cZwtXwnHra4YujmGdcVQ9/tuXD/DhTsWT4/q/n+zWaMkSQXIzMeAG4EXAQdHxOw3hCOAXcOKS5I0ONacSYUan/Pr0Mb1M139YjRo3cS7c/NpA4lhMXXFIHUjIg4H/ndmPhYRq4GX0hoM5Ebg1cA24BzgquFFKUkaFJMzSZKGZy2wtep39jTg8sy8JiLuBrZFxLuB24CLhhmkJGkwlkzOImJ/4Cbg6dX6V2TmOyLiaFq/6D2LVkfm12bm9+oMVpKkUZKZXwaeN8/8B4ATBx+RJGmYOqk5m70Hy3RE7At8LiKuA95M6x4s2yLig7TuwfKBGmOVJEmS1CfddAe45JQDaoxEs5YcEMR7sEiSJElS/TrqczZK92Bp2n02Bh1vL/dVKX3fzr1vxWL3sqjrnhu96OTeGyUpff+2x1D6uTtX0+KVJEmd6Sg5G6V7sDTtPhuDjreX+0eUvm/nlm2xe1nUdc+NXnRy742SlL5/22Mo/dydq2nxSpKkznR1nzPvwSJJkiRJ9ehktEbvwSJJkiQNSTcDd9Rlx67Ha2nNUkLZStJJGynvwSJJkiRJNVsyOfMeLFrI3F86Nq6fWfAXlZ2bTxtESJIkSVJjddXnTJIkSZJUD5MzSZIkSSpAc8blliRJteqmY77N1ctR13HzfJAGz5ozSZIkSSqANWcqTgm/1DmsqyRJkgbNmjNJkiRJKoDJmSRJkiQVwGaNkiRJy1RCU/xulNBsv2n7TM1Uwrm+HNacSZIkSVIBTM4kSRqSiDgyIm6MiLsj4q6IuKCa/86I2BURt1ePU4cdqySpfjZrlCRpeGaAjZn5pYg4ENgeEddXy96bmf9tiLFJkgbM5EySpCHJzN3A7ur5ExFxD7BuuFFJkobF5EySpAJExDjwPOBm4MXA+RHxOuBWWrVrj87zmg3ABoCxsTGmpqZ6imHj+pmO1+11W52anp4e2LaWox/7bL4ydvO+JVjqGLWXscTzrFez5aurbCWcD2Ory4ijTp2Use5z0uRMkqQhi4g1wMeBN2XmtyLiA8AfAFn9vRD49bmvy8wtwBaAiYmJnJyc7CmOc7sZRe/s3rbVqampKXotV536sc/mK2M371uCpc6H9jKWeJ71arZ8dZWthPNh4/oZLtwx2qlDJ2Ws+5wc7T08wpo2PGhd8TZtP0jSXBGxL63E7NLM/ARAZu5pW/4h4JohhSdJGqAlR2t0JClJkuoREQFcBNyTmX/SNn9t22qvAu4cdGySpMHrpObMkaQkSarHi4HXAjsi4vZq3tuB10TECbSaNe4EfnMYwUmSBmvJ5MyRpCRJqkdmfg6IeRZ9ctCxSJKGr6s+Z8sZSUqSJEkqSTd91nduPq3GSKSn6jg5W+5IUv0e5rdXpQ/JO9dC8ZY4lGnThlg13notFm8Jwwe3xzAqnwuSJKnZOkrOehlJqt/D/Paq9CF551oo3hKGVJ2raUOsGm+9Fou3hOGD22MYlc8FSZLUbJ2M1uhIUpIkSZJUs05+hnckKUmSJEmqWSejNTqSlCRJkiTVrDkdWFaA+UYO2rh+psj+ZVIvuhklS5IkaaVYss+ZJEmSJKl+JmeSJEmSVACTM0mSJEkqgH3OJElSrbrpZ7pz82k1RqK6LHWMm9yHvpPzt8nlU1msOZMkSZKkApicSZIkSVIBTM4kSZIkqQAmZ5IkSZJUAAcEkSRJGoCFBpZwMImFOZiMVhprziRJkiSpACZnkiQNSUQcGRE3RsTdEXFXRFxQzT80Iq6PiHurv4cMO1ZJUv1MziRJGp4ZYGNmHge8EHhjRBwHbAJuyMxjgRuqaUnSiDM5kyRpSDJzd2Z+qXr+BHAPsA44HdharbYVOGMoAUqSBsoBQSRJKkBEjAPPA24GxjJzd7XoEWBsgddsADYAjI2NMTU11VMMG9fPdLxuN9vq5X2np6d7LleduinbQsZW9+d9SjaIMtZ1TnZiOeX780uv6njdjeu7jaj/PE9b6v48MjmTJGnIImIN8HHgTZn5rYj4t2WZmRGR870uM7cAWwAmJiZycnKypzi6GTFw59mdb6uX952amqLXctWpH6Msblw/w4U7Rvsr2SDKWNc52QmP4WjopIzdnGfLsWSzRjsrS5JUn4jYl1ZidmlmfqKavSci1lbL1wJ7hxWfJGlwOulzZmdlSZJqEK0qsouAezLzT9oWXQ2cUz0/B+i8/ZMkqbGWTM7srCxJUm1eDLwWODkibq8epwKbgZdGxL3Az1fTkqQR11XD0RI6K/eq5I7F83VAbFLnyybFCsZbt9Ljbe+IPba6u47Zi1m/7qC+vM9iSv4cU3cy83NALLD4JYOMRZI0fB0nZ6V0Vu5VyR2L5+uc2qTOl02KFYy3bk2Kt5+x1t1RGMr+HJOkYRnv8yAf0jB0dJ8zOytLkiRJUr06Ga3RzsqSJEmSVLNO2vHMdlbeERG3V/PeTqtz8uURcR7wIHBmLRFKkiRJ0gqwZHJmZ+Xe2P5ZkiRJUiea0VtfkiRpQPxhVdKwdDQgiCRJkiSpXiZnkiRJklQAkzNJkiRJKoB9zpbBtuiSJEmS+s2aM0mSJEkqgMmZJEmSJBXA5EySJEmSCmByJkmSJEkFMDmTJEmSpAI4WqMkSRp5jrQsqQmsOZMkSZKkApicSZI0JBFxcUTsjYg72+a9MyJ2RcTt1ePUYcYoSRockzNJkobnEuCUeea/NzNPqB6fHHBMkqQhsc+ZJA1JN31gdm4+rcZINCyZeVNEjA87DklSGUzOJEkqz/kR8TrgVmBjZj4630oRsQHYADA2NsbU1FRPG924fqbjdbvZVjfv++eXXvWU6bHVPzhv1vp1B9USw6CNrS47vn4Y9TKOevnAMs7q9XN2KUsmZxFxMfBKYG9mHl/NeyfwG8DXqtXebrMLSZL64gPAHwBZ/b0Q+PX5VszMLcAWgImJiZycnOxpw+d2U5t7dufb6uZ959q4foYLd8z/dWVQMdRtsTKOilEv46iXDyzjrG4+d5ajkz5nl2B7eEmSBiIz92Tmk5n5feBDwInDjkmSNBhLJmeZeRPwzQHEIknSihcRa9smXwXcudC6kqTR0kvd5FDaw/dqenp6oG3ye9Wk9r1NihWMt25NirefsdbVD6f9ffvxOaYyRMTHgEngsIh4GHgHMBkRJ9Bq1rgT+M1hxSdJGqzlJmdDaw/fq6mpKQbZJr9XTWrf26RYwXjr1qR4+xlrXX1g2t+3H59jKkNmvmae2RcNPBBJUhGWdZ8z28NLkiRJUn8tKzmzPbwkSZIk9VcnQ+nbHl6SJEmSarZkcmZ7eEmSJEmq37KaNUqSJEmS+svkTJIkSZIKYHImSZIkSQUwOZMkSZKkApicSZIkSVIBTM4kSZIkqQAmZ5IkSZJUAJMzSZIkSSqAyZkkSZIkFcDkTJIkSZIKYHImSZIkSQUwOZMkSZKkApicSZIkSVIBTM4kSRqiiLg4IvZGxJ1t8w6NiOsj4t7q7yHDjFGSNBj7DDsASRol45uuHXYIap5LgL8APtw2bxNwQ2ZujohN1fRbhxCbJGmArDmTJGmIMvMm4JtzZp8ObK2ebwXOGGRMkqThWLLmLCIuBl4J7M3M46t5hwKXAePATuDMzHy0vjAlSVpRxjJzd/X8EWBsvpUiYgOwAWBsbIypqameNrpx/UzH63azrW7ed66x1Qu//s8vvaqLGJYdQu0WK+OoGPUyjnr5wDLO6vVzdimdNGu8BJtbSJI0FJmZEZELLNsCbAGYmJjIycnJnrZ1bhfNcnee3fm2unnfuTaun+HCHaPdC8MyNt+olw8s46xuPvuWY8lmjTa3kCRp4PZExFqA6u/eIccjSRqA5aa/HTW3gP43uejV9PT0vDHs2PV4x+8xyKYRTapCblKsYLx1a1K8TYi1/XNroc8xjZSrgXOAzdXfztvvSZIaq+e6ycWaW1TL+9rkoldTU1PMF0MvTS7q1KQq5CbFCsZbtybF24RY25tRLPQ5pmaKiI8Bk8BhEfEw8A5aSdnlEXEe8CBw5vAilCQNynK/jeyJiLWZudvmFpIkLV9mvmaBRS8ZaCCSpKFb7lD6s80twOYWkiRJktSzJZOzqrnF54HnRsTDVROLzcBLI+Je4OeraUmSJEnSMi3ZrNHmFpIkSZJUv+U2a5QkSZIk9ZHJmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRJkqQCmJxJkiRJUgFMziRJkiSpAEve50ySJGmu8U3XDjsESRo51pxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgrgUPqSJBUoInYCTwBPAjOZOTHciCRJdespOfPCIUlSrU7KzK8POwhJ0mD0o+bMC4ckSZIk9chmjZIklSmBT0dEAn+ZmVvmrhARG4ANAGNjY0xNTfW0wY3rZ3p6fR3GVpcZVz9ZxuYb9fKBZZzV6+fsUnpNzpa8cEiSpGX56czcFRE/BFwfEf+YmTe1r1Bdd7cATExM5OTkZE8bPHfTtT29vg4b189w4Y7R/i3ZMjbfqJcPLOOsnWdP1hpDr3t4yQtHv3/V69X09PS8MZT6S0CTfqVoUqxgvHVrUrxNiLX9c2uhzzGNlszcVf3dGxFXAicCNy3+KklSk/WUnHVy4ej3r3q9mpqaYr4YSvy1EJr1K0WTYgXjrVuT4m1CrO2/1C30OabREREHAE/LzCeq5y8Dfn/IYUmSarbs+5xFxAERceDsc1oXjjv7FZgkSSvYGPC5iLgDuAW4NjP/dsgxSZJq1stPxWPAlREx+z4f9cIhSVLvMvMB4CeGHYckabCWnZx54ZAkSZKk/im7k0WPxufpR7Zx/Uyx/cskSZIkrVzL7nMmSZIkSeofkzNJkiRJKoDJmSRJkiQVoFF9zubrQyZJkiRJo8CaM0mSJEkqgMmZJEmSJBXA5EySJEmSCmByJkmSJEkFaNSAIJK0UrUPiLRx/QznLjJA0s7Npw0iJEmS1GfWnEmSJElSAUzOJEmSJKkAJmeSJEmSVACTM0mSJEkqgMmZJEmSJBXA5EySJEmSCtBTchYRp0TEVyLivojY1K+gJEla6bzGStLKs+zkLCJWAe8HXgEcB7wmIo7rV2CSJK1UXmMlaWXqpebsROC+zHwgM78HbANO709YkiStaF5jJWkFisxc3gsjXg2ckpmvr6ZfC7wgM8+fs94GYEM1+VzgK8sPty8OA74+5Bi60aR4mxQrGG/dmhRvk2KFwcR7VGYeXvM2tIAGX2Pr0LT/z+WwjM036uUDy9hPC15j96l7y5m5BdhS93Y6FRG3ZubEsOPoVJPibVKsYLx1a1K8TYoVmhev6lPaNbYOK+F8t4zNN+rlA8s4KL00a9wFHNk2fUQ1T5Ik9cZrrCStQL0kZ18Ejo2IoyNiP+As4Or+hCVJ0ormNVaSVqBlN2vMzJmIOB/4FLAKuDgz7+pbZPVpWvOPJsXbpFjBeOvWpHibFCs0L151qcHX2DqshPPdMjbfqJcPLONALHtAEEmSJElS//R0E2pJkiRJUn+YnEmSJElSAUY6OYuInRGxIyJuj4hbq3mHRsT1EXFv9feQYccJEBHPreKcfXwrIt4UEe+MiF1t808dYowXR8TeiLizbd68+zNa/iwi7ouIL0fE8wuJ979GxD9WMV0ZEQdX88cj4jtt+/mDhcS74PGPiLdV+/crEfHyAmK9rC3OnRFxezW/hH17ZETcGBF3R8RdEXFBNb+483eRWIs9d6W6zHcdb7purqVN1O21rIm6vaY0zSLlG5njGBH7R8QtEXFHVcZ3VfOPjoibq+v/ZdEakGmwMnNkH8BO4LA58/4Y2FQ93wS8Z9hxzhP3KuAR4CjgncBvDzumKq6fBZ4P3LnU/gROBa4DAnghcHMh8b4M2Kd6/p62eMfb1yto/857/IHjgDuApwNHA/cDq4YZ65zlFwK/V9C+XQs8v3p+IPBP1T4s7vxdJNZiz10fPup6zHcdb/qjm2tpEx/dXMua+uj2mtK0xyLlG5njWF3f11TP9wVurq73lwNnVfM/CLxh0LGNdM3ZAk4HtlbPtwJnDC+UBb0EuD8zHxx2IO0y8ybgm3NmL7Q/Twc+nC1fAA6OiLUDCbQyX7yZ+enMnKkmv0Dr3kFFWGD/LuR0YFtmfjczvwrcB5xYW3BzLBZrRARwJvCxQcWzlMzcnZlfqp4/AdwDrKPA83ehWEs+dyV1rstraeN0eS1rpGVcUxplkfKNjOr6Pl1N7ls9EjgZuKKaP5RjOOrJWQKfjojtEbGhmjeWmbur548AY8MJbVFn8dQvtudXTZkuLrCKfKH9uQ54qG29hynvH/vXadWOzDo6Im6LiL+LiJ8ZVlDzmO/4l7x/fwbYk5n3ts0rZt9GxDjwPFq/khV9/s6JtV1Tzl2pV/Ndx0dRE76b9Krk7zLL1uE1pbHmuQ6NzHGMiFXR6oKxF7ieViukx9p+CB3KtX/Uk7OfzsznA68A3hgRP9u+MFt1lkXdS6Bq2/qLwN9Usz4APAc4AdhNq7lYkUrcnwuJiN8FZoBLq1m7gR/OzOcBbwY+GhHPHFZ8bRpz/Nu8hqf+uFDMvo2INcDHgTdl5rfal5V2/i4Ua4POXakfFr2Oj6LSPov6pInXsiU16ZqyHPOUb6SOY2Y+mZkn0GqJciLwY8ONqGWkk7PM3FX93QtcSWvH75ltnlT93Tu8COf1CuBLmbkHIDP3VCfP94EPMcCmax1aaH/uAo5sW++Iat7QRcS5wCuBs6sPT6rmgd+onm+n9evJjw4tyMoix7/I/RsR+wC/BFw2O6+UfRsR+9K6yFyamZ+oZhd5/i4Qa6POXakfFriOj6LSv5v0pAHfZbrW5TWlceYr3ygeR4DMfAy4EXgRrW4M+1SLhvLdamSTs4g4ICIOnH1OqzP9ncDVwDnVaucAVw0nwgU9pdZhTj+XV9EqQ0kW2p9XA6+LlhcCj7dV9Q9NRJwCvAX4xcz817b5h0fEqur5jwDHAg8MJ8p/t8jxvxo4KyKeHhFH04r3lkHHN4+fB/4xMx+enVHCvq36wV0E3JOZf9K2qLjzd6FYm3buSr1a5Do+ikr/btKTBnyX6coyrimNssh1aGSOY3XtPLh6vhp4Ka2+dTcCr65WG84x7HVEkVIfwI/QGs3uDuAu4Her+c8CbgDuBT4DHDrsWNtiPgD4BnBQ27y/BnYAX6b1T792iPF9jFY19v+m1Q73vIX2J61RcN5P61f8HcBEIfHeR6sv0e3V44PVur9cnSe3A18CfqGQeBc8/sDvVvv3K8Arhh1rNf8S4LfmrFvCvv1pWs1Lvtx27E8t8fxdJNZiz10fPup4sMB1vOmPbq6lTXx0ey1r4qPba0rTHouUb2SOI/AfgduqstzJv48w/SO0fuy+j1YXo6cPOraoApEkSZIkDdHINmuUJEmSpCYxOZMkSZKkApicSZIkSVIBTM4kSZIkqQAmZ5IkSZJUAJMzSZIkSSqAyZkkSZIkFcDkTJIkSZIKYHImSZIkSQUwOZMkSZKkApicSZIkSVIBTM4kSZIkqQAmZ5IkSZJUAJMzSZIkSSqAyZkkSZIkFcDkTJIkSZIKYHImSZIkSQUwOZMkSZKkApicSZIkSVIBTM4kSZIkqQAmZ5IkSZJUAJMzSZIkSSqAyZkkSZIkFcDkTJIkSZIKYHImSZIkSQUwOZMkSZKkApicSZIkSVIBTM4kSZIkqQAmZ5IkSZJUAJMzSZIkSSqAyZkkSZIkFcDkTJIkSZIKYHImdSkiLomIdw9we2dHxKfbpjMijhnU9iVJkjQYJmdS4TLz0sx82bDjkCRJUr1MzqQuRMSqYccgSZKk0WRyptpExKaIuD8inoiIuyPiVRHx9Ih4LCKOb1vv8Ij4TkT8UDX9lojYHRH/EhGvX6oZX0T8VETsaU+cIuKXIuKO6vnT2mL5RkRcHhGHtq37NxHxSEQ8HhE3RcSPty27JCI+EBGfjIhvAyfN2fadEfELbdP7RsTXI+J5i8Q7XpXp1yLioYh4NCJ+qyrHl6v98xdt658bEZ9b4L2eHhH/LSL+udoHH4yI1dWyQyLimoj4WrWNayLiiLbXHl2V94mI+ExEvD8iPtK2/IUR8f9V8dwREZMLlUmSJEm9MzlTne4HfgY4CHgX8BHgUOATwGva1jsT+LvM3BsRpwBvBn4eOAaYXGojmflF4BtAe9O/1wIfrp7/Z+AM4OeAZwOPAu9vW/c64Fjgh4AvAZfO2cT/BfwhcCAwN0n6MPCrbdOnArsz87al4gZeUG33/wT+FPhdWuX+ceDMiPi5Dt5jM/CjwAm09tc64PeqZU8D/jtwFPDDwHeAv2h77UeBW4BnAe+ktc8AiIh1wLXAu2kds98GPh4Rh3cQkyRJkpYhMnPYMWiFiIjbgXcA3wb+MjOfU83/h2r6wxFxMbAnM99WLTsGuBc4NjPvW+S93wr8x8w8u6oVexh4Tmbujoh7gPMz84Zq3bXAPwOrM3NmzvscTCt5OzgzH4+IS4CnZebr2ta5BHg4M/+fiHg28BVgXWZ+KyKuAG7JzD9eJNZx4KvAEZm5q5r3DeA/ZeZl1fTHgb/PzD+NiHOB12fmT1fLklZSdz8wXZX7/mrZi4CPZubR82z3BODGzDwkIn4YeAB4Zmb+a7X8IwCZ+avV/jw+M9sTtk9V7711obJJkiRp+fYZdgAaXRHxOlq1YOPVrDXAYcA1wDMi4gXAHlq1PldW6zwbuLXtbR7qcHMfAe6JiANo1cT9fWburpYdBVwZEd9vW/9JYCwiHqFVK/YrwOHA7DqHAY8vFUNm/kuVXP5yRFwJvAK4oMOY97Q9/84802uWeP3hwDOA7RExOy+AVQAR8QzgvcApwCHV8gOr5p/PBr45m5hVHgKOrJ4fBfxKe5NNYF/gxqWLJUmSpOUwOVMtIuIo4EPAS4DPZ+aTVc1ZVM8vp9W0cQ9wTWY+Ub10N3BE21sdSQcyc1dEfB74JVrN8z7Qtvgh4Ncz8x/mifO1wOm0mhPupNUE81FaSc6/vf0Sm98KvJ7W/9PnZ2vDBuDrtJK4H19gmxuB5wIvyMxHqpqz22iVbTdwaEQ8oy1Ba9/XDwF/nZm/UVv0kiRJegr7nKkuB9BKar4GEBG/BhzftvyjtPpanV09n3U58GsR8R+qmp//t4ttfhh4C7CeVr+2WR8E/rBKGGcHIDm9WnYg8F1afdaeAfxRF9ub9T+A59OqMfvw4qv2T2Z+n1YC/N62wVTWRcTLq1UOpJW8PVY19XxH22sfpFVD+c6I2K9qDtleS/YR4Bci4uURsSoi9o+IyfYBRSRJktRfJmeqRWbeDVwIfJ5W7dh64B/alt9Mq+/Zs2kNyDE7/zrgz2g1n7sP+EK16LsdbPZKqiaMc5rrvQ+4Gvh0RDxRvecLqmUfBh4EdgF3t22vY5n5HeDjwNE8NSkchLdS7aeI+BbwGVq1ZdAaZGQ1rRq2LwB/O+e1ZwMvopWYvhu4jGo/Z+ZDtGoU304rwX4I+B38zJAkSaqNA4KoaBHxH4A7gafPHbxjgfXvB34zMz9Te3BP3e7vAT+amb+65MqFiojLgH/MzHcsubIkSZL6zl/BVZz49/uhHQK8B/ifHSZmv0yrKeVn645xznYPBc4Dtgxyu72q7qv2nGjdB+4UWjVl/2PIYUmSJK1YJmcq0W8Ce2kNFf8k8AaAiLgrIqbneZwdEVO0BgF5Y9UXayAi4jdoNfm7LjNvapt/9gKx3jWo2DrwfwBTtIbj/zPgDR3en02SJEk16KhZY0TsBJ6g9UV5JjMnqtqCy2gNk74TODMzH60tUkmSJEkaYd3UnJ2UmSdk5kQ1vQm4ITOPBW6opiVJkiRJy9BNzdlEZn69bd5XgMnM3B0Ra4GpzHzuQu8BcNhhh+X4+PiS2/v2t7/NAQccsOR6TWKZmsEyNccolqukMm3fvv3rmXn4sOOQJGkl6fQm1ElrGPIE/jIztwBjmbm7Wv4IMLbUm4yPj3PrrbcuubGpqSkmJyc7DK0ZLFMzWKbmGMVylVSmiHhw2DFIkrTSdFpzti4zd1U3ur0e+M/A1Zl5cNs6j2bmIfO8dgOwAWBsbOwnt23btuT2pqenWbNmTceFaALL1AyWqTlGsVwllemkk07a3taMXZIkDUBHNWeZuav6uzcirgROBPZExNq2Zo17F3jtFqohxicmJrKTX4VL+vW4XyxTM1im5hjFco1imSRJUueWHBAkIg6IiANnnwMvo3VT4KuBc6rVzgGuqitISZIkSRp1ndScjQFXRsTs+h/NzL+NiC8Cl0fEecCDwJn1hSlJkiRJo23J5CwzHwB+Yp753wBeUkdQkiRJkrTSdHOfM0mSJElSTUzOJEmSJKkAJmeSJEmSVIBOb0ItqQ/GN13b8bo7N59WYySSJEkqjTVnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgqwz7ADkLTyjG+6tuN1d24+rcZIJEmSymHNmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVoOPkLCJWRcRtEXFNNX10RNwcEfdFxGURsV99YUqSJEnSaOum5uwC4J626fcA783MY4BHgfP6GZgkSZIkrSQdJWcRcQRwGvBX1XQAJwNXVKtsBc6oIT5JkiRJWhEiM5deKeIK4L8ABwK/DZwLfKGqNSMijgSuy8zj53ntBmADwNjY2E9u27Ztye1NT0+zZs2azkvRAJapGeou045dj3e87vp1B/VlmyUep37shxLL1auSynTSSSdtz8yJYcchSdJKss9SK0TEK4G9mbk9Iia73UBmbgG2AExMTOTk5NJvMTU1RSfrNYllaoa6y3Tupms7Xnfn2f2Jo8Tj1I/9UGK5ejWKZZIkSZ1bMjkDXgz8YkScCuwPPBN4H3BwROyTmTPAEcCu+sKUJEmSpNG2ZJ+zzHxbZh6RmePAWcBnM/Ns4Ebg1dVq5wBX1RalJEmSJI24TmrOFvJWYFtEvBu4DbioPyFJzTLeRRM9SZIkaSFdJWeZOQVMVc8fAE7sf0iSJEmStPJ0c58zSZIkSVJNTM4kSZIkqQAmZ5IkSZJUAJMzSZIkSSqAyZkkSZIkFcDkTJIkSZIKYHImSZIkSQXo5SbUkgqx2I2wN66f4dy25Ts3nzaIkCRJktQla84kSZIkqQAmZ5IkSZJUAJMzSZIkSSqAfc5UnMX6T/WiaX2t6toPkiRJKpM1Z5IkSZJUAJMzSZIkSSqAyZkkSZIkFcA+Z5JGRjf99JrWB1GSJI0+a84kSZIkqQAmZ5IkSZJUAJMzSZIkSSqAfc60YnTSH2nj+hnO3XTtSPdHsl+WJElSmaw5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklQABwSR1BfdDDTSj/edHbxFkiRpVFhzJkmSJEkFMDmTJEmSpAKYnEmSJElSAUzOJEmSJKkAJmeSJEmSVACTM0mSJEkqgMmZJEmSJBXA+5xpIOq6B5bq5XGTJEkanCVrziJi/4i4JSLuiIi7IuJd1fyjI+LmiLgvIi6LiP3qD1eSJEmSRlMnzRq/C5ycmT8BnACcEhEvBN4DvDczjwEeBc6rLUpJkiRJGnFLJmfZMl1N7ls9EjgZuKKavxU4o44AJUmSJGkliMxceqWIVcB24Bjg/cB/Bb5Q1ZoREUcC12Xm8fO8dgOwAWBsbOwnt23btuT2pqenWbNmTRfFKN9KL9OOXY/XHE1/jK2GPd+B9esO6vg1pZdttkyjptdydXOMB6Wkz4mTTjppe2ZODDsOSZJWko4GBMnMJ4ETIuJg4ErgxzrdQGZuAbYATExM5OTk5JKvmZqaopP1mmSll+nchgwssXH9DBfu2IedZ092/JrSyzZbplHTa7m6OcaDMoqfE5IkqXNdDaWfmY8BNwIvAg6OiNlvRkcAu/obmiRJkiStHJ2M1nh4VWNGRKwGXgrcQytJe3W12jnAVTXFKEmSJEkjr5M2QWuBrVW/s6cBl2fmNRFxN7AtIt4N3AZcVGOckiRJkjTSlkzOMvPLwPPmmf8AcGIdQUmSJEnSStNVnzNJkiRJUj1MziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgpgciZJkiRJBejkJtRaQcY3XdvxupecckCNkUiSJEkrizVnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRJkqQCmJxJkiRJUgG8z1lDdXM/sp2bT6sxktHUzf6VJEmS+sGaM0mSJEkqgMmZJEmSJBXA5EySJEmSCmByJkmSJEkFMDmTJEmSpAKYnEmSJElSAUzOJEmSJKkAJmeSJEmSVABvQl2z2ZsZb1w/w7lL3NjYm0VLkiRJK5c1Z5IkSZJUAJMzSZIkSSqAyZkkSZIkFcA+Z1q2HbseX7IfnSRJkqTOWHMmSZIkSQUwOZMkSZKkApicSZIkSVIB7HO2AozbL0ySJEkq3pI1ZxFxZETcGBF3R8RdEXFBNf/QiLg+Iu6t/h5Sf7iSJEmSNJo6adY4A2zMzOOAFwJvjIjjgE3ADZl5LHBDNS1JkiRJWoYlk7PM3J2ZX6qePwHcA6wDTge2VqttBc6oKUZJkiRJGnmRmZ2vHDEO3AQcD/xzZh5czQ/g0dnpOa/ZAGwAGBsb+8lt27YtuZ3p6WnWrFnTcVwl27HrcQDGVsOe7yy+7vp1B3X9vsPUSZmaxjI1R6/l6ub/bVBK+uw76aSTtmfmxLDjkCRpJek4OYuINcDfAX+YmZ+IiMfak7GIeDQzF+13NjExkbfeeuuS25qammJycrKjuEo3OxjHxvUzXLhj8fFXdm4+rev3HaZOytQ0lqk5ei1XN/9vg1LSZ19EmJxJkjRgHQ2lHxH7Ah8HLs3MT1Sz90TE2mr5WmBvPSFKkiRJ0ujrZLTGAC4C7snMP2lbdDVwTvX8HOCq/ocnSZIkSStDJ22CXgy8FtgREbdX894ObAYuj4jzgAeBM2uJUJIkSZJWgCWTs8z8HBALLH5Jf8Ppr276ZTWtv5ckSZKk0dJRnzNJkiRJUr1MziRJkiSpACZnkiRJklSA0bv5UYPZl02SJElauaw5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgrgfc4krUjd3Fdw5+bTaoxEkiSpxZozSZIkSSqAyZkkSZIkFcDkTJIkSZIKYHImSZIkSQUwOZMkSZKkApicSZIkSVIBTM4kSZIkqQAmZ5IkSZJUAJMzSZIkSSqAyZkkSZIkFcDkTJIkSZIKYHImSZIkSQXYZ9gBlGJ807XDDkGSJEnSCmbNmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklSARt3nzHuRSZIkSRpVS9acRcTFEbE3Iu5sm3doRFwfEfdWfw+pN0xJkiRJGm2dNGu8BDhlzrxNwA2ZeSxwQzUtSZIkSVqmJZOzzLwJ+Oac2acDW6vnW4Ez+huWJEmSJK0syx0QZCwzd1fPHwHG+hSPJEmSJK1IkZlLrxQxDlyTmcdX049l5sFtyx/NzHn7nUXEBmADwNjY2E9u27Ztye1NT0+zZs2aH5i/Y9fjS762VGOrYc93hh1Ff1mmZhjFMsFgy7V+3UED2c5Cn33DcNJJJ23PzIlhxyFJ0kqy3NEa90TE2szcHRFrgb0LrZiZW4AtABMTEzk5Obnkm09NTTHfeuc2eLTGjetnuHBHowbHXJJlaoZRLBMMtlw7z54cyHYW+uyTJEkrw3KbNV4NnFM9Pwe4qj/hSJIkSdLK1MlQ+h8DPg88NyIejojzgM3ASyPiXuDnq2lJkiRJ0jIt2SYoM1+zwKKX9DkWSZIkSVqxltusUZIkSZLURyZnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVwORMkiRJkgpgciZJkiRJBTA5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQVYJ9hByBJWtr4pms7Xnfn5tNqjESSJNXFmjNJkiRJKoDJmSRJkiQVwORMkiRJkgpgciZJkiRJBehpQJCIOAV4H7AK+KvM3NyXqCSpIN0MxtGLjetnOHdA25IkSeVZds1ZRKwC3g+8AjgOeE1EHNevwCRJkiRpJemlWeOJwH2Z+UBmfg/YBpzen7AkSZIkaWXpJTlbBzzUNv1wNU+SJEmS1KXIzOW9MOLVwCmZ+fpq+rXACzLz/DnrbQA2VJPPBb7SwdsfBnx9WYGVyzI1g2VqjlEsV0llOiozDx92EJIkrSS9DAiyCziybfqIat5TZOYWYEs3bxwRt2bmRA+xFccyNYNlao5RLNcolkmSJHWul2aNXwSOjYijI2I/4Czg6v6EJUmSJEkry7JrzjJzJiLOBz5Fayj9izPzrr5FJkmSJEkrSE/3OcvMTwKf7FMs7bpqBtkQlqkZLFNzjGK5RrFMkiSpQ8seEESSJEmS1D+99DmTJEmSJPVJUclZRJwSEV+JiPsiYtOw4+lGROyMiB0RcXtE3FrNOzQiro+Ie6u/h1TzIyL+rCrnlyPi+cON/t9FxMURsTci7myb13U5IuKcav17I+KcYZSlLZb5yvTOiNhVHa/bI+LUtmVvq8r0lYh4edv8Ys7PiDgyIm6MiLsj4q6IuKCa39hjtUiZGnusImL/iLglIu6oyvSuav7REXFzFd9l1aBKRMTTq+n7quXjbe81b1klSdIIycwiHrQGFbkf+BFgP+AO4Lhhx9VF/DuBw+bM+2NgU/V8E/Ce6vmpwHVAAC8Ebh52/G0x/yzwfODO5ZYDOBR4oPp7SPX8kMLK9E7gt+dZ97jq3Hs6cHR1Tq4q7fwE1gLPr54fCPxTFXtjj9UiZWrssar295rq+b7AzdX+vxw4q5r/QeAN1fP/BHywen4WcNliZR3W+efDhw8fPnz4qOdRUs3ZicB9mflAZn4P2AacPuSYenU6sLV6vhU4o23+h7PlC8DBEbF2CPH9gMy8CfjmnNndluPlwPWZ+c3MfBS4Hjil9uAXsECZFnI6sC0zv5uZXwXuo3VuFnV+ZubuzPxS9fwJ4B5gHQ0+VouUaSHFH6tqf09Xk/tWjwROBq6o5s89TrPH7wrgJRERLFxWSZI0QkpKztYBD7VNP8ziX8xKk8CnI2J7RGyo5o1l5u7q+SPAWPW8aWXtthxNKd/5VRO/i2eb/9HAMlVN355Hq1ZmJI7VnDJBg49VRKyKiNuBvbSS3/uBxzJzplqlPb5/i71a/jjwLAorkyRJqkdJyVnT/XRmPh94BfDGiPjZ9oWZmbQSuEYblXIAHwCeA5wA7AYuHGo0yxQRa4CPA2/KzG+1L2vqsZqnTI0+Vpn5ZGaeABxBq7brx4YbkSRJKlVJydku4Mi26SOqeY2Qmbuqv3uBK2l9Cdsz21yx+ru3Wr1pZe22HMWXLzP3VF+avw98iH9vItaYMkXEvrSSmEsz8xPV7EYfq/nKNArHCiAzHwNuBF5Eq1np7H0m2+P7t9ir5QcB36DQMkmSpP4qKTn7InBsNYrZfrQ6w1895Jg6EhEHRMSBs8+BlwF30op/dvS7c4CrqudXA6+rRtB7IfB4W1O0EnVbjk8BL4uIQ6omaC+r5hVjTh+/V9E6XtAq01nVqHlHA8cCt1DY+Vn1Q7oIuCcz/6RtUWOP1UJlavKxiojDI+Lg6vlq4KW0+tLdCLy6Wm3ucZo9fq8GPlvVgC5UVkmSNEL2WXqVwcjMmYg4n9YXw1XAxZl515DD6tQYcGXruyX7AB/NzL+NiC8Cl0fEecCDwJnV+p+kNXrefcC/Ar82+JDnFxEfAyaBwyLiYeAdwGa6KEdmfjMi/oDWl2SA38/MTgfk6LsFyjQZESfQava3E/hNgMy8KyIuB+4GZoA3ZuaT1fuUdH6+GHgtsKPqzwTwdpp9rBYq02safKzWAlsjYhWtH8Muz8xrIuJuYFtEvBu4jVZSSvX3ryPiPlqD2JwFi5dVkiSNjmj9KCtJkiRJGqaSmjVKkiRJ0oplciZJkiRJBTA5kyRJkqQCmJxJkiRJUgFMziRJkiSpACZnkiRJklQAkzNJkiRJKoDJmSRJkiQV4P8HhwFv+r8o6bYAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "X_train_num_transformed.hist(figsize=(15,9), bins=30)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:17.300950Z", "start_time": "2021-10-13T07:17:16.516675Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[,\n", " ],\n", " [,\n", " ]], dtype=object)" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "X_test_num_transformed.hist(figsize=(15,9), bins=30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zmienna mileage na zbiorze treningowym z silnie skośnej nabrała cech rozkładu normalnego, pozostałe przypadki nie wyglądają jednak na rozkład normalny.\n", "\n", "Wypróbujmy inny sposób modyfikacji rozkładu - QuantileTransformer" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:18.505059Z", "start_time": "2021-10-13T07:17:18.494059Z" } }, "outputs": [], "source": [ "from sklearn.preprocessing import QuantileTransformer" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T12:33:51.065807Z", "start_time": "2021-10-12T12:33:51.054809Z" } }, "source": [ "tworzymy obiekt klasy QuantileTransformer, zamiast bazowego rozkładu jednostajnego wybierając rozkład normalny" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:19.603548Z", "start_time": "2021-10-13T07:17:19.595552Z" } }, "outputs": [], "source": [ "qt = QuantileTransformer(output_distribution=\"normal\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:20.741079Z", "start_time": "2021-10-13T07:17:20.712098Z" } }, "outputs": [], "source": [ "qt.fit(X_train[num_columns])\n", "X_train_num_transformed = pd.DataFrame(qt.transform(X_train[num_columns]), columns =num_columns)\n", "X_test_num_transformed = pd.DataFrame(qt.transform(X_test[num_columns]), columns =num_columns)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:22.402716Z", "start_time": "2021-10-13T07:17:21.796969Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[,\n", " ],\n", " [,\n", " ]], dtype=object)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "X_train_num_transformed.hist(figsize=(15,9), bins=30)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:24.287340Z", "start_time": "2021-10-13T07:17:23.467093Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[,\n", " ],\n", " [,\n", " ]], dtype=object)" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "X_test_num_transformed.hist(figsize=(15,9), bins=30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jak widzimy rozkłady są teraz zupełnie inne, na zbiorze treningowym bardzo zbliżone do rozkładu normalnego, jednak na zbiorze testowym juz dość znacznie się różnią, co może wynikać po części z niewielkiego rozmiaru próby." ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T12:44:21.258422Z", "start_time": "2021-10-12T12:44:21.242568Z" } }, "source": [ "
\n", "Info \n", "\n", "To jaki dokładnie zestaw transformacji ostatecznie wybrać powinno wynikać przede wszystkim z obserwacji ustalonej wcześniej metryki jakości modelu.\n", "
" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T05:54:13.280903Z", "start_time": "2021-10-13T05:54:13.268867Z" } }, "source": [ "# Łączenie zmiennych numerycznych w przedziały" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T05:58:15.399488Z", "start_time": "2021-10-13T05:58:15.382490Z" } }, "source": [ "podobnie jak w przypadku zmiennych kategorycznych, zmienne numeryczne również można przekształcać grupując razem pewne ich wartości. Proces taki nazywamy kubełkowaniem." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Definicja \n", "\n", "Kubełkowanie (ang. *binning*) polega na łączeniu wartości zmiennych numerycznych w przedziały, ma to na celu zmniejszenie możliwości przeuczenia modelu.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wybór takich przedziałów może występować zarówno na podstawie cech rozkładu zmiennych (np wartości kwartyli) jak i wiedzy domenowej, tutaj zaprezentujemy obie możliwości." ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T06:29:15.187589Z", "start_time": "2021-10-13T06:29:15.174595Z" } }, "source": [ "do podziału wg statystyk pozycyjnych z rozkładu wykorzystamy funkcję qcut z biblioteki pandas" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:26.802519Z", "start_time": "2021-10-13T07:17:26.750194Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagemileage_binned_4mileage_binned_10
82524486(293524.25, 699892.0](429566.5, 699892.0]
991166856(162418.5, 293524.25](162418.5, 212552.8]
78994191(61161.25, 162418.5](78348.9, 116729.4]
89454210(3784.999, 61161.25](48631.6, 78348.9]
398264049(162418.5, 293524.25](212552.8, 265707.6]
............
106127914(61161.25, 162418.5](116729.4, 162418.5]
270185880(162418.5, 293524.25](162418.5, 212552.8]
860116011(61161.25, 162418.5](78348.9, 116729.4]
43525782(3784.999, 61161.25](25757.7, 48631.6]
102145116(61161.25, 162418.5](116729.4, 162418.5]
\n", "

750 rows × 3 columns

\n", "
" ], "text/plain": [ " mileage mileage_binned_4 mileage_binned_10\n", "82 524486 (293524.25, 699892.0] (429566.5, 699892.0]\n", "991 166856 (162418.5, 293524.25] (162418.5, 212552.8]\n", "789 94191 (61161.25, 162418.5] (78348.9, 116729.4]\n", "894 54210 (3784.999, 61161.25] (48631.6, 78348.9]\n", "398 264049 (162418.5, 293524.25] (212552.8, 265707.6]\n", ".. ... ... ...\n", "106 127914 (61161.25, 162418.5] (116729.4, 162418.5]\n", "270 185880 (162418.5, 293524.25] (162418.5, 212552.8]\n", "860 116011 (61161.25, 162418.5] (78348.9, 116729.4]\n", "435 25782 (3784.999, 61161.25] (25757.7, 48631.6]\n", "102 145116 (61161.25, 162418.5] (116729.4, 162418.5]\n", "\n", "[750 rows x 3 columns]" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train[\"mileage_binned_4\"] = pd.qcut(X_train[\"mileage\"], q=4)\n", "X_train[\"mileage_binned_10\"] = pd.qcut(X_train[\"mileage\"], q=10)\n", "X_train[[\"mileage\",\"mileage_binned_4\",\"mileage_binned_10\"]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Stworzyliśmy tutaj 2 nowe cechy na zbiorze treningowym w oparciu o kwartyle i decyle rozkładu zmiennej mileage. Jak widzimy poszczególnym wartościom przypisane zostały wartości przedziałów do których one wpadają w danym podziale na kubełki." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "jeśli chcemy samodzielnie określić etykiety przedziałów można posłużyć się parametrem labels" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:28.921670Z", "start_time": "2021-10-13T07:17:28.889069Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagemileage_binned_4mileage_binned_10
82524486410
99116685636
7899419124
8945421013
39826404937
............
10612791425
27018588036
86011601124
4352578212
10214511625
\n", "

750 rows × 3 columns

\n", "
" ], "text/plain": [ " mileage mileage_binned_4 mileage_binned_10\n", "82 524486 4 10\n", "991 166856 3 6\n", "789 94191 2 4\n", "894 54210 1 3\n", "398 264049 3 7\n", ".. ... ... ...\n", "106 127914 2 5\n", "270 185880 3 6\n", "860 116011 2 4\n", "435 25782 1 2\n", "102 145116 2 5\n", "\n", "[750 rows x 3 columns]" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train[\"mileage_binned_4\"] = pd.qcut(X_train[\"mileage\"], q=4, labels=np.arange(1,5))\n", "X_train[\"mileage_binned_10\"] = pd.qcut(X_train[\"mileage\"], q=10, labels=np.arange(1,11))\n", "X_train[[\"mileage\",\"mileage_binned_4\",\"mileage_binned_10\"]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Uwaga! \n", " \n", "Wszystkie przekształcenia wykorzystujące informacje o rozkładach cech należy implementować najpierw na zbiorze treningowym, a następnie w oparciu o rozkład ze zbioru treningowego - na zbiorze testowym. Inaczej wykorzystujemy informacje ze zbioru testowego i przestaje on być niezależny.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "tutaj możemy skorzystać z parametru retbins i dostać granice kubełków a następnie w oparciu o te granice dokonać identycznego podziału na zbiorze testowym" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:31.262868Z", "start_time": "2021-10-13T07:17:31.238876Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 3785. , 61161.25, 162418.5 , 293524.25, 699892. ])" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "_, bins = pd.qcut(X_train[\"mileage\"], q=4, retbins=True)\n", "bins" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "alternatywnym podejściem jest użycie funkcji cut z biblioteki pandas, która pozwala podzielić wartości zmiennej na zdefiniowaną liczbę przedziałów o identycznej szerokości lub przypisać je do zdefiniowanych samodzielnie przedziałów" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "załóżmy, że jeśli chodzi o wiek samochodu znaczenie mają przedziały do 3 lat, od 3 do 7, od 7 do 12, 12-25 oraz ponad 25. Możemy łatwo dokonać takiego przypisania przydzielając poszczególnym kubełkom odpowiednie nazwy:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:33.515740Z", "start_time": "2021-10-13T07:17:33.488642Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageage_binned
8265extremely_old
99125very_old
78921very_old
89467extremely_old
39836extremely_old
.........
10631extremely_old
27059extremely_old
86014very_old
4357middle_age
10242extremely_old
\n", "

750 rows × 2 columns

\n", "
" ], "text/plain": [ " age age_binned\n", "82 65 extremely_old\n", "991 25 very_old\n", "789 21 very_old\n", "894 67 extremely_old\n", "398 36 extremely_old\n", ".. ... ...\n", "106 31 extremely_old\n", "270 59 extremely_old\n", "860 14 very_old\n", "435 7 middle_age\n", "102 42 extremely_old\n", "\n", "[750 rows x 2 columns]" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train[\"age_binned\"] = pd.cut(X_train[\"age\"],[0,3,7,12,25,100], labels =[\"new\",\"middle_age\",\"old\",\"very_old\",\"extremely_old\"] )\n", "X_train[[\"age\",\"age_binned\"]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Normalizacja i Standaryzacja" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Załóżmy, że finalnie mamy zbiór danych złożony stricte ze zmiennych numerycznych:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:35.815133Z", "start_time": "2021-10-13T07:17:35.791137Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagecondition_transformedageavg_yearly_mileageis_classic
825244862.0658069.00.0
9911668563.0256674.00.0
789941912.0214485.00.0
894542101.067809.00.0
3982640494.0367335.00.0
..................
1061279143.0314126.00.0
2701858803.0593151.00.0
8601160110.0148286.00.0
435257822.073683.00.0
1021451162.0423455.00.0
\n", "

750 rows × 5 columns

\n", "
" ], "text/plain": [ " mileage condition_transformed age avg_yearly_mileage is_classic\n", "82 524486 2.0 65 8069.0 0.0\n", "991 166856 3.0 25 6674.0 0.0\n", "789 94191 2.0 21 4485.0 0.0\n", "894 54210 1.0 67 809.0 0.0\n", "398 264049 4.0 36 7335.0 0.0\n", ".. ... ... ... ... ...\n", "106 127914 3.0 31 4126.0 0.0\n", "270 185880 3.0 59 3151.0 0.0\n", "860 116011 0.0 14 8286.0 0.0\n", "435 25782 2.0 7 3683.0 0.0\n", "102 145116 2.0 42 3455.0 0.0\n", "\n", "[750 rows x 5 columns]" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train = X_train.loc[:,[\"mileage\",\"condition_transformed\", \"age\",\"avg_yearly_mileage\",\"is_classic\"]]\n", "X_test = X_test.loc[:,[\"mileage\",\"condition_transformed\", \"age\",\"avg_yearly_mileage\",\"is_classic\"]]\n", "X_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "możemy łatwo zaobserwować, że zmienne znacznie różnią się pod względem średniej czy wariancji:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:37.305187Z", "start_time": "2021-10-13T07:17:37.248078Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagecondition_transformedageavg_yearly_mileageis_classic
count750.00750.00750.00750.00750.00
mean198670.122.4136.945458.120.01
std158883.171.1620.342766.600.12
min3785.000.002.00118.000.00
25%61161.252.0019.003306.750.00
50%162418.502.0037.005615.000.00
75%293524.253.0055.007816.250.00
max699892.004.0071.0012205.001.00
\n", "
" ], "text/plain": [ " mileage condition_transformed age avg_yearly_mileage \\\n", "count 750.00 750.00 750.00 750.00 \n", "mean 198670.12 2.41 36.94 5458.12 \n", "std 158883.17 1.16 20.34 2766.60 \n", "min 3785.00 0.00 2.00 118.00 \n", "25% 61161.25 2.00 19.00 3306.75 \n", "50% 162418.50 2.00 37.00 5615.00 \n", "75% 293524.25 3.00 55.00 7816.25 \n", "max 699892.00 4.00 71.00 12205.00 \n", "\n", " is_classic \n", "count 750.00 \n", "mean 0.01 \n", "std 0.12 \n", "min 0.00 \n", "25% 0.00 \n", "50% 0.00 \n", "75% 0.00 \n", "max 1.00 " ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.round(X_train.describe(),2)" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T12:57:38.502082Z", "start_time": "2021-10-12T12:57:38.483083Z" } }, "source": [ "Niektóre metody modelowania są zależne od odległości bądź wariancji zmiennych, więc chcąc aby wpływ danej zmiennej na predykcje wynikał przede wszystkim z jej związku ze zmienną celu, a nie ze skali, powinniśmy zastosować normalizację lub standaryzację" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "zacznijmy od normalizacji, zrealizujemy ją za pomocą kolejnego transformera z biblioteki sklearn: MinMaxScaler" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T12:59:31.456780Z", "start_time": "2021-10-12T12:59:31.451782Z" } }, "source": [ "
\n", "Definicja \n", "\n", "Normalizacja polega na przekształcaniu zmiennej do zakresu wartości <0,1> poprzez odjęcie minumum i podzielenie przez różnicę pomiędzy maksimum a minimum z rozkładu.\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:40.148991Z", "start_time": "2021-10-13T07:17:40.135140Z" } }, "outputs": [], "source": [ "from sklearn.preprocessing import MinMaxScaler" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T05:15:34.463942Z", "start_time": "2021-10-13T05:15:34.450911Z" } }, "source": [ "tworzymy obiekt klasy MinMaxScaler korzystając z bazowych ustawień, możliwa jest zmiana docelowego zakresu wartości z bazowego <0,1> na dowolnie wybrany poprzez użycie parametru feature_range" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:41.519658Z", "start_time": "2021-10-13T07:17:41.505312Z" } }, "outputs": [], "source": [ "mm = MinMaxScaler()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Metody są oczywiście analogiczne jak w poprzednich przypadkach, konwertujemy wyniki z powrotem na ramki danych aby łatwiej było je oglądać" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:42.980277Z", "start_time": "2021-10-13T07:17:42.922226Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagecondition_transformedageavg_yearly_mileageis_classic
count750.00750.00750.00750.00750.00
mean0.280.600.510.440.01
std0.230.290.290.230.12
min0.000.000.000.000.00
25%0.080.500.250.260.00
50%0.230.500.510.450.00
75%0.420.750.770.640.00
max1.001.001.001.001.00
\n", "
" ], "text/plain": [ " mileage condition_transformed age avg_yearly_mileage is_classic\n", "count 750.00 750.00 750.00 750.00 750.00\n", "mean 0.28 0.60 0.51 0.44 0.01\n", "std 0.23 0.29 0.29 0.23 0.12\n", "min 0.00 0.00 0.00 0.00 0.00\n", "25% 0.08 0.50 0.25 0.26 0.00\n", "50% 0.23 0.50 0.51 0.45 0.00\n", "75% 0.42 0.75 0.77 0.64 0.00\n", "max 1.00 1.00 1.00 1.00 1.00" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mm.fit(X_train)\n", "X_train_mm_scaled = pd.DataFrame(mm.transform(X_train), columns=X_train.columns)\n", "X_test_mm_scaled = pd.DataFrame(mm.transform(X_test), columns=X_test.columns)\n", "np.round(X_train_mm_scaled.describe(),2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "jak widzimy wszystkie cechy zostały teraz przeniesione do tego samego zakresu wartości <0,1>, ale ich średnia i odchylenie standardowe nie są identyczne. Oczywiście nie mamy gwarancji, że na nowych danych nie pojawią się wartości spoza wykresu widzianego na zbiorze treningowym. Jeśli chcemy być pewni, że znormalizowane zmienne zachowają swój zakres wartości należy tworząc obiekt klasy MinMaxScaler ustawić parametr clip na True." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Uwaga! \n", " \n", "Nie zaleca się korzystania z MinMaxScaler dla zmiennych posiadających wartości odstające. Jeśli takie wartości nie zostaną wcześniej prawidłowo obsłużone, to większość \"normalnych\" wartości zmiennej będzie \"upchana\" w małym zakresie wartości co nie będzie sprzyjać jej wartości dla predykcji. \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "zaprezentujemy teraz przykład standaryzacji z wykorzystaniem transformera StandardScaler z biblioteki sklearn" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-12T13:00:59.929173Z", "start_time": "2021-10-12T13:00:59.914162Z" } }, "source": [ "
\n", "Definicja \n", "\n", "Standaryzacja polega na przekształcaniu zmiennej do rozkładu o wartości oczekiwanej 0 i odchyleniu standardowym 1 poprzez odjęcie średniej i podzielenie przez odchylenie standardowe\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:46.352480Z", "start_time": "2021-10-13T07:17:46.341479Z" } }, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "tworzymy obiekt klasy StandardScaler korzystając z bazowych ustawień" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:47.954486Z", "start_time": "2021-10-13T07:17:47.945485Z" } }, "outputs": [], "source": [ "ss =StandardScaler()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Metody rownież są analogiczne jak w poprzednich przypadkach, konwertujemy wyniki z powrotem na ramki danych aby łatwiej było je oglądać" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:17:49.512341Z", "start_time": "2021-10-13T07:17:49.423237Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mileagecondition_transformedageavg_yearly_mileageis_classic
count750.00750.00750.00750.00750.00
mean0.00-0.00-0.00-0.000.00
std1.001.001.001.001.00
min-1.23-2.08-1.72-1.93-0.12
25%-0.87-0.35-0.88-0.78-0.12
50%-0.23-0.350.000.06-0.12
75%0.600.510.890.85-0.12
max3.161.371.682.448.20
\n", "
" ], "text/plain": [ " mileage condition_transformed age avg_yearly_mileage is_classic\n", "count 750.00 750.00 750.00 750.00 750.00\n", "mean 0.00 -0.00 -0.00 -0.00 0.00\n", "std 1.00 1.00 1.00 1.00 1.00\n", "min -1.23 -2.08 -1.72 -1.93 -0.12\n", "25% -0.87 -0.35 -0.88 -0.78 -0.12\n", "50% -0.23 -0.35 0.00 0.06 -0.12\n", "75% 0.60 0.51 0.89 0.85 -0.12\n", "max 3.16 1.37 1.68 2.44 8.20" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ss.fit(X_train)\n", "X_train_ss_scaled = pd.DataFrame(ss.transform(X_train), columns=X_train.columns)\n", "X_test_ss_scaled = pd.DataFrame(ss.transform(X_test), columns=X_test.columns)\n", "np.round(X_train_ss_scaled.describe(),2)" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T05:47:31.194364Z", "start_time": "2021-10-13T05:47:31.178364Z" } }, "source": [ "W przeciwieństwie do poprzedniego przekształcenia zmienne mają identyczną średnią i odchylenie standardowe, za to różnią sie zakresami wartości." ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T05:50:25.897677Z", "start_time": "2021-10-13T05:50:25.880675Z" } }, "source": [ "
\n", "Info \n", "\n", "Jako że StandardScaler opiera się na użyciu średniej i odchylenia standardowego z transformowanej zmiennej, również nie jest on wolny od wpływu wartości odstających. Jeśli chcemy być pewni, że wartości odstające nie będą miały wpływu na skalę przekształconej zmiennej można skorzystać z klasy RobustScaler \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Łączenie różnych transformacji w ramach pipeline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "cofnijmy się teraz na chwilę do etapu generowania danych i zobaczmy jak można w łatwy i niezawodny sposób łączyć ze sobą różne transformacje z wykorzystaniem obiektów Pipeline oraz ColumnTransformer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Definicja \n", "\n", "Pipeline jest to przepływ danych przez ułożone w kolejności moduły wykonujące ustalone transformacje, zazwyczaj ostatnim elementem jest model predykcyjny\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T08:30:51.418449Z", "start_time": "2021-10-13T08:30:51.387402Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
conditionmileagebrandage
82very_good69205Skoda6
991good322639VW46
789good86970Fiat20
894very_good524559Fiat66
398medium18954Audi35
...............
106good209892Renault38
270very_good108168Seat51
860good39632Mercedes59
435medium267041Fiat50
102good24438Audi26
\n", "

750 rows × 4 columns

\n", "
" ], "text/plain": [ " condition mileage brand age\n", "82 very_good 69205 Skoda 6\n", "991 good 322639 VW 46\n", "789 good 86970 Fiat 20\n", "894 very_good 524559 Fiat 66\n", "398 medium 18954 Audi 35\n", ".. ... ... ... ...\n", "106 good 209892 Renault 38\n", "270 very_good 108168 Seat 51\n", "860 good 39632 Mercedes 59\n", "435 medium 267041 Fiat 50\n", "102 good 24438 Audi 26\n", "\n", "[750 rows x 4 columns]" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "UsedCars_df =generate_used_cars_data()\n", "X = UsedCars_df.drop(\"selling_price\",axis=1)\n", "y = UsedCars_df[\"selling_price\"]\n", "X[\"age\"] = 2021 - X[\"year_manufactured\"]\n", "X.drop(\"year_manufactured\", axis=1, inplace=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.25, random_state=42)\n", "X_train" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "zdefiniujmy teraz grupy zmiennych, które będziemy poddawać poszczególnym transformacjom:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T08:31:37.861867Z", "start_time": "2021-10-13T08:31:37.843794Z" } }, "outputs": [], "source": [ "columns_for_ordinal_encoding =[\"condition\"]\n", "columns_for_target_encoding =[\"brand\"]\n", "numerical_columns =[\"age\",\"mileage\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "następnie importujemy niezbędne klasy" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T07:37:51.258106Z", "start_time": "2021-10-13T07:37:50.986228Z" } }, "outputs": [], "source": [ "from sklearn.compose import ColumnTransformer\n", "from sklearn.pipeline import Pipeline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "definiujemy pipeline do przetwarzania poszczególnych grup kolumn, pipeline mogą zawierać wiele kroków, tutaj dla uproszczenia wykorzystamy jednoelementowe" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T08:46:33.279578Z", "start_time": "2021-10-13T08:46:33.264583Z" } }, "outputs": [], "source": [ "pipeline_oe = Pipeline(steps =[(\"OrdinalEncoder\",\n", " OrdinalEncoder(\n", " categories =[['very_bad', 'bad', 'medium', 'good', 'very_good']],\n", " handle_unknown ='use_encoded_value', unknown_value=np.NaN))])\n", "\n", "pipeline_jse = Pipeline(steps=[(\"JamesSteinEncoder\",JamesSteinEncoder())])\n", "\n", "pipeline_num = Pipeline(steps=[(\"PowerTransformer\",PowerTransformer(standardize=False))])" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T08:47:50.362158Z", "start_time": "2021-10-13T08:47:50.346529Z" } }, "source": [ "następnie przypisujemy zmienne do poszczególnych transformacji, korzystając z obiektu ColumnTransformer" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T08:50:55.791722Z", "start_time": "2021-10-13T08:50:55.784725Z" } }, "outputs": [], "source": [ "column_transformer = ColumnTransformer(\n", " transformers=[\n", " ('categorical_oe', pipeline_oe, columns_for_ordinal_encoding),\n", " ('categorical_jse', pipeline_jse, columns_for_target_encoding),\n", " ('numerical', pipeline_num, numerical_columns)\n", " ])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "sam ColumnTransformer również może być częścią pipeline, przykładowo możemy na koniec zastosować standaryzacje" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T08:59:34.098331Z", "start_time": "2021-10-13T08:59:34.091331Z" } }, "outputs": [], "source": [ "preprocessing_pipeline = Pipeline(steps = [\n", " (\"column_transformer\", column_transformer),\n", " (\"scaler\",StandardScaler())\n", " ])" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T09:08:30.550361Z", "start_time": "2021-10-13T09:08:30.533364Z" } }, "source": [ "jeśli używamy pipeline bez modelu predykcyjnego na końcu to stosujemy te same metody co przy zwykłych transformerach" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T08:59:37.863310Z", "start_time": "2021-10-13T08:59:37.797282Z" } }, "outputs": [ { "data": { "text/plain": [ "Pipeline(steps=[('column_transformer',\n", " ColumnTransformer(transformers=[('categorical_oe',\n", " Pipeline(steps=[('OrdinalEncoder',\n", " OrdinalEncoder(categories=[['very_bad',\n", " 'bad',\n", " 'medium',\n", " 'good',\n", " 'very_good']],\n", " handle_unknown='use_encoded_value',\n", " unknown_value=nan))]),\n", " ['condition']),\n", " ('categorical_jse',\n", " Pipeline(steps=[('JamesSteinEncoder',\n", " JamesSteinEncoder())]),\n", " ['brand']),\n", " ('numerical',\n", " Pipeline(steps=[('PowerTransformer',\n", " PowerTransformer(standardize=False))]),\n", " ['age', 'mileage'])])),\n", " ('scaler', StandardScaler())])" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preprocessing_pipeline.fit(X_train,y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "po uruchomieniu metody fit widzimy wszystkie kroki całego pipeline" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T09:04:04.397527Z", "start_time": "2021-10-13T09:04:04.362537Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "rozmiar zbioru treningowego po transformacji: (750, 4)\n", "rozmiar zbioru testowego po transformacji: (250, 4)\n", "[[ 1.34093122 -0.77016684 -1.5987142 -0.59924888]\n", " [ 0.46641086 -0.80925124 0.58475157 0.97365003]\n", " [ 0.46641086 -0.7939586 -0.68985786 -0.40448688]\n", " ...\n", " [ 0.46641086 0.70876962 1.13401097 -1.02756173]\n", " [-0.4081095 -0.7939586 0.75822769 0.74397369]\n", " [ 0.46641086 0.80959101 -0.36550292 -1.35095193]]\n" ] } ], "source": [ "X_train_transformed = preprocessing_pipeline.transform(X_train)\n", "X_test_transformed = preprocessing_pipeline.transform(X_test)\n", "print(f\"rozmiar zbioru treningowego po transformacji: {X_train_transformed.shape}\")\n", "print(f\"rozmiar zbioru testowego po transformacji: {X_test_transformed.shape}\")\n", "print(X_train_transformed)" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T09:11:50.317268Z", "start_time": "2021-10-13T09:11:50.299272Z" } }, "source": [ "jak widzimy zwrócony zbiór treningowy ma typ danych array a jego wymiary odpowiadają tym przed transformacją, zgodność wymiarów zależy jednak od zastosowanych transformacji" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "jeśli pipeline jest zakończony modelem predykcyjnym jego metody są identyczne jak metody modelu, czyli korzystamy z fit i predict, tak jak w poniższym przykładzie" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T09:15:56.032669Z", "start_time": "2021-10-13T09:15:56.026673Z" } }, "outputs": [], "source": [ "from sklearn.linear_model import LinearRegression\n", "\n", "final_pipeline = Pipeline(steps = [\n", " (\"preprocessing\", preprocessing_pipeline),\n", " (\"model\", LinearRegression())\n", " ])" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2021-10-13T09:19:56.002592Z", "start_time": "2021-10-13T09:19:55.993593Z" } }, "source": [ "poniżej pokazujemy jak wytrenować pipeline w oparciu o zbiór treningowy a następnie dokonać predykcji na zbiorze testowym" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2021-10-13T09:20:56.132669Z", "start_time": "2021-10-13T09:20:56.071678Z" } }, "outputs": [ { "data": { "text/plain": [ "0 9649.925584\n", "1 30782.788094\n", "2 44681.214268\n", "3 5967.815692\n", "4 45684.785298\n", "Name: prediction, dtype: float64" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_pipeline.fit(X_train, y_train)\n", "X_test_predicted = pd.Series(final_pipeline.predict(X_test),name=\"prediction\")\n", "X_test_predicted.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Podsumowanie" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Powyżej zaprezentowaliśmy kilka różnych przykładów przekształcania surowych danych w cechy predykcyjne przydatne przy modelowaniu. Niektóre transformacje można z powodzeniem stosować przy pracy nad innymi problemami, inne należy raczej potraktować jako inspirację. Ważne aby prace nad Feature Engineering poprzedzone były dobrym zrozumieniem danych. Niezwykle ważne jest tutaj aby już na tym etapie stosować odpowiednią strategię walidacyjną, aby zapobiec korzystaniu z informacji ze zbioru testowego, inaczej nasze wyniki nie będą miarodajne." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "426.667px" }, "toc_section_display": true, "toc_window_display": true }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }